|
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師( V7 S: g1 M# h' ~: _& G2 N
關(guān)注我,一起變得更加優(yōu)秀!: H* T, ^! \7 f
在嵌入式軟件開發(fā)領(lǐng)域,C 語(yǔ)言是一種功能強(qiáng)大、靈活的編程語(yǔ)言,它提供了很多語(yǔ)法特性,有些語(yǔ)法可能看起來(lái)比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。3 G0 f6 y; G( h0 Z0 h
以下是一些可能被認(rèn)為花哨的C語(yǔ)言特性及其示例:( @ F' e4 S* x
1. 宏定義的高級(jí)用法' |) p a- l0 P. G& C( V
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。#define SQUARE(x) ((x) * (x))int a = 5;printf("%d
. |( y+ S7 \9 A0 t* r7 s% f", SQUARE(a++)); // 輸出25,但a的值會(huì)改變?yōu)?
E" @5 K. _: n# g# k2. 指針的指針
! L; d: F* @) I5 \指向指針的指針可以用于實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),比如二維數(shù)組。int **pptr;int arr[2][2] = {{1, 2}, {3, 4}};pptr = &arr[0];printf("%d n3 G" C% @% M9 j: L. \2 V
", *(*(pptr + 1) + 1)); // 輸出40 D1 P8 H- W! f" _$ M: L
3. 函數(shù)指針數(shù)組
! A: D" l3 n% O, L- ^% I8 b數(shù)組中的每個(gè)元素都是指向函數(shù)的指針,這可以用于回調(diào)函數(shù)或?qū)崿F(xiàn)簡(jiǎn)單的函數(shù)映射。void (*func_array[])(int) = {func1, func2, func3};func_array[1](42); // 調(diào)用func2
1 x M9 z9 E8 N. ]4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)
0 R. c6 M+ |" p6 ^- }3 u& S使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。struct Point { int x, y;};
4 e1 w B. m: g1 Q9 s) rvoid print_point(struct Point p) { printf("(%d, %d)% Q: ?/ T0 ]8 V3 I" `. u' q
", p.x, p.y);}
- L: H$ k% r9 `; ^5 f" Astruct Point p = {1, 2};print_point(p);# w1 Q- a& T, o' j) I! k' `
5. 靜態(tài)和動(dòng)態(tài)內(nèi)存分配1 j; j3 m! o2 l% y* z
使用 “malloc” 和 “free” 可以動(dòng)態(tài)地分配和釋放內(nèi)存。int *p = malloc(sizeof(int) * 10);
& B. a5 d4 v+ m5 v* @0 U$ rif (p) { for (int i = 0; i 10; i++) { p = i * i; } free(p);}
/ U* z7 V7 Q6 \7 N9 d6. 復(fù)雜的遞歸: E: J! h5 a: }7 S9 X
遞歸函數(shù)可以用于解決分治問(wèn)題,但需要小心處理避免棧溢出。int factorial(int n){ if (n 1) return 1; return n * factorial(n - 1);}: @2 N p0 e/ n4 Z; S$ u% K
7. 位操作3 s6 M; y1 s% t1 m
位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測(cè)試位的狀態(tài)。int flags = 0x03; // 00000011flags |= 0x04; // 00000101flags &= 0x01; // 00000001flags ^= 0x01; // 111111107 [* e p& ~- L. ~7 ?' ?
8. 復(fù)雜的條件編譯' W9 D* c1 \! `* y/ J2 {: X
預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。 #define DEBUG 1 int main() { #if DEBUG printf("Debug mode is on.
) f1 y1 A6 f* p"); #endif #ifdef DEBUG // 調(diào)試代碼 #endif return 0; }! `) x" b9 T. B$ l- R3 U4 l W
9. 復(fù)雜的類型轉(zhuǎn)換' {( x9 q" T0 U- W- u% C' v- k7 n
強(qiáng)制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問(wèn)題。double d = 3.14159;int *p = (int *)&d;printf("%d- U4 i L+ F" T* f/ r
", *p); // 輸出整數(shù)部分,可能不安全
- F2 a: a5 o, d5 e, \10. 使用"__attribute__"擴(kuò)展' W: Y- C* v6 ^
"__attribute__"是GCC編譯器提供的擴(kuò)展,可以用來(lái)控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。void __attribute__((noreturn)) fatal_error(const char *msg) { fprintf(stderr, "Fatal error: %s' {, t) L: M0 @' T
", msg); exit(EXIT_FAILURE);}8 f% p" t4 t& z/ h5 {3 y
這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時(shí),應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。
0 ?1 S7 m$ B p-END-" k8 Y. r, @: a, U! z! X( p
往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀
6 J s: E6 ~) s! r5 v! ~/ g' F. `( D0 F1 l6 T7 c8 r& W
8 }. |" w' _5 B% H$ E0 G P+ B; x) R" _6 a) ?) c2 W
& K* e6 g! @( W8 S# Y( Y9 L
% j9 U5 S3 F; ?4 W
jwz5q4xn5526408842600.jpg (115.65 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
jwz5q4xn5526408842600.jpg
2024-8-29 12:13 上傳
+ Q: `9 h; [% N" q* U# o: T
( o1 H3 t9 |$ C( B& m% b 被 char 類型的變量坑慘了!0 _. Z& D: @! u$ H+ ^. `
u: d, f7 ~- k
6 c' M+ O2 R$ E6 e$ V - m% [! }% O& _' x+ P
2 W% x2 ], f8 J/ x' w8 T# e4 e
1f2of10ca0n6408842700.jpg (80.73 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
1f2of10ca0n6408842700.jpg
2024-8-29 12:13 上傳
- H) ^- w1 m: ]( d+ i" f" V4 O
0 t7 V8 f5 q6 X+ Z2 L/ \/ C 嵌入式 C 語(yǔ)言知識(shí)點(diǎn),動(dòng)態(tài)變長(zhǎng)數(shù)組5 [' f [. K9 J, ?+ r0 M
$ q3 F1 V' W7 V. N( K! b 7 G/ p5 N- W' k4 Z1 A( S, v2 F
2 ^! d( [; K. [
7 U+ y O! s# m$ H4 \
zce0qcvyylb6408842800.jpg (114.88 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
zce0qcvyylb6408842800.jpg
2024-8-29 12:13 上傳
$ ]! c+ l- z6 [ 0 A4 G4 K/ J, w
嵌入式 C 語(yǔ)言技巧,不完全類型# R9 Z) z, S' e, z1 C" B
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
% |0 @0 ?$ [3 |) ^0 d0 ?' I" e關(guān)注我,一起變得更加優(yōu)秀! |
|