|
我是老溫,一名熱愛學習的嵌入式工程師
( a5 Z, n5 d' \: U- O1 d關注我,一起變得更加優(yōu)秀!- I2 |$ ^/ N& F/ P" r
在嵌入式軟件開發(fā)領域,C 語言是一種功能強大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。, k9 {3 r/ V8 @2 }8 R$ N$ v1 x8 X# Q
以下是一些可能被認為花哨的C語言特性及其示例:8 v0 ^( E" C! |
1. 宏定義的高級用法8 \5 Q! T& M6 x- ?9 C& l! D
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調試難度。#define SQUARE(x) ((x) * (x))int a = 5;printf("%d( [" G, L& Z7 g Q
", SQUARE(a++)); // 輸出25,但a的值會改變?yōu)?5 q; I1 S/ Y1 z$ y& f
2. 指針的指針
7 v+ Q+ d8 k/ b指向指針的指針可以用于實現(xiàn)復雜的數(shù)據(jù)結構,比如二維數(shù)組。int **pptr;int arr[2][2] = {{1, 2}, {3, 4}};pptr = &arr[0];printf("%d: I- X Y0 Y( {( t' z
", *(*(pptr + 1) + 1)); // 輸出4
X% D* W8 x+ L( }6 i3. 函數(shù)指針數(shù)組/ C' X+ ^5 P- N7 f1 F: B* R7 m# G
數(shù)組中的每個元素都是指向函數(shù)的指針,這可以用于回調函數(shù)或實現(xiàn)簡單的函數(shù)映射。void (*func_array[])(int) = {func1, func2, func3};func_array[1](42); // 調用func2
8 B$ V' ~. D: E! \3 C1 _4. 結構體和聯(lián)合體作為函數(shù)參數(shù)
4 t( \8 x$ _% n6 \+ H使用結構體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復雜的數(shù)據(jù)結構。struct Point { int x, y;};
2 v8 L2 ?5 @. Kvoid print_point(struct Point p) { printf("(%d, %d): A x- V: h+ K5 m; @9 I9 V- d, C
", p.x, p.y);}
, H& B0 c6 `8 z" I1 U& C2 _8 cstruct Point p = {1, 2};print_point(p);
3 [4 Y) w/ n, R# O6 @5. 靜態(tài)和動態(tài)內存分配
# T2 [5 F# q6 }/ i使用 “malloc” 和 “free” 可以動態(tài)地分配和釋放內存。int *p = malloc(sizeof(int) * 10);
, x M8 e' b2 q" _if (p) { for (int i = 0; i 10; i++) { p = i * i; } free(p);}
9 s5 v* r, y7 W! K4 D5 `+ r6. 復雜的遞歸# Y6 {9 m( m3 [. q; C5 P8 i
遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。int factorial(int n){ if (n 1) return 1; return n * factorial(n - 1);}
# g% U; d6 V4 F+ {+ Z: w7. 位操作% G+ {& {0 R, Z* S& H9 W: g! _
位操作可以用于設置、清除、翻轉、測試位的狀態(tài)。int flags = 0x03; // 00000011flags |= 0x04; // 00000101flags &= 0x01; // 00000001flags ^= 0x01; // 11111110
# b# w& O4 L( e" f0 b9 A& `/ m8. 復雜的條件編譯( E) `) }( D! @+ g; f8 z( A$ ~4 g
預處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復雜的條件編譯。 #define DEBUG 1 int main() { #if DEBUG printf("Debug mode is on.
7 E' \# T5 K9 i) U"); #endif #ifdef DEBUG // 調試代碼 #endif return 0; }
( s+ J, Z1 v, v; t- j- d/ y2 p' V9. 復雜的類型轉換
' H& R* ~, v d0 Y& f6 @強制類型轉換可以用于將一種類型的數(shù)據(jù)轉換為另一種類型,但需要小心使用以避免問題。double d = 3.14159;int *p = (int *)&d;printf("%d! f$ d; m7 u3 r4 w
", *p); // 輸出整數(shù)部分,可能不安全
- y* k# Y4 f' ^10. 使用"__attribute__"擴展, @; m4 A7 m( W
"__attribute__"是GCC編譯器提供的擴展,可以用來控制函數(shù)的調用約定、內聯(lián)等。void __attribute__((noreturn)) fatal_error(const char *msg) { fprintf(stderr, "Fatal error: %s
: B# _/ c0 x _) }" v2 u! e4 C! G/ q", msg); exit(EXIT_FAILURE);}
9 j9 ]- P3 T& g5 [; Y) C# Q- C這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護。因此,在使用這些特性時,應該權衡其利弊,并確保代碼的清晰性和可讀性。
4 ^$ N/ g7 ]+ c& S8 N& }-END-8 y s1 x2 q7 d: z
往期推薦:點擊圖片即可跳轉閱讀0 Q4 ^1 ~3 r/ E) j
/ @' U5 b' }$ ]' E 7 y# C: u9 }1 d* r& r0 g& ^7 @
( p/ }- |7 m ?( {7 e3 M$ R9 X
# A; g& W0 `5 h# f
( e6 D% U( \" h1 H7 w
0nz2leceguu6407353041.jpg (115.65 KB, 下載次數(shù): 3)
下載附件
保存到相冊
0nz2leceguu6407353041.jpg
2024-8-22 13:04 上傳
9 Q5 z$ `" e: D, h2 C5 R, t6 O
# z m; b- O- L$ v
被 char 類型的變量坑慘了!$ g) q+ w+ Y2 j
. b* v2 K( G' h5 t" N ^5 W Y/ @ W& b9 A+ r 3 X1 A/ ]) h7 |" _7 N3 T: _/ h9 Z
2 |8 {& Z6 G* h$ o' l$ p( F3 s
0 U! m$ ~( ~. O5 O$ G. k7 C
godymjyzsqs6407353141.jpg (80.73 KB, 下載次數(shù): 3)
下載附件
保存到相冊
godymjyzsqs6407353141.jpg
2024-8-22 13:04 上傳
" T. I, @; x3 P% @, V; X
/ x1 f `2 U+ @, f- _0 [# V 嵌入式 C 語言知識點,動態(tài)變長數(shù)組
- b2 V x c1 @7 V- j5 _1 s
* U& f* r1 t' X+ q8 I L8 G. c ) A; @5 i& e: e, |- ?1 E8 J9 F$ T
) `" l. P7 d3 h" k) v x5 `
' P) F k9 Y% T2 i/ {
uhjmkka5wjj6407353241.jpg (114.88 KB, 下載次數(shù): 3)
下載附件
保存到相冊
uhjmkka5wjj6407353241.jpg
2024-8-22 13:04 上傳
" {/ M$ ~3 I3 @
+ a8 k6 ]& B5 z; K 嵌入式 C 語言技巧,不完全類型$ E" S: p; ~* Y( s
我是老溫,一名熱愛學習的嵌入式工程師1 b9 H. ]3 O' \: G$ B3 k$ L
關注我,一起變得更加優(yōu)秀! |
|