電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 53|回復(fù): 0
收起左側(cè)

嵌入式 C 語言,那些“花里胡哨”的語法特性。

[復(fù)制鏈接]

455

主題

455

帖子

849

積分

二級會員

Rank: 2

積分
849
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-20 17:50:00 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
& U! ]5 H, T0 I* }4 ^7 c  N; w4 P2 ~1 M關(guān)注我,一起變得更加優(yōu)秀!; r; \: a' N9 l) l
在嵌入式軟件開發(fā)領(lǐng)域,C 語言是一種功能強大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。2 t7 f% u0 u% o
以下是一些可能被認(rèn)為花哨的C語言特性及其示例:
' V+ @% G, R. x) L3 Y( O- v1 x9 |1. 宏定義的高級用法
) _) x4 G0 W( F6 X7 l1 E使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。
  • #define SQUARE(x) ((x) * (x))int a = 5;printf("%d
    ( N6 ]1 ]( I6 U6 ]" }5 x1 C% f", SQUARE(a++)); // 輸出25,但a的值會改變?yōu)?
    0 `" }& @6 x7 p; ?0 E2. 指針的指針! M* K# r4 ?6 K
    指向指針的指針可以用于實現(xiàn)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),比如二維數(shù)組。
  • int **pptr;int arr[2][2] = {{1, 2}, {3, 4}};pptr = &arr[0];printf("%d
    7 g, b. d' I4 W0 f# e8 A- ?", *(*(pptr + 1) + 1)); // 輸出4
    ; g% Z" U3 h6 R3. 函數(shù)指針數(shù)組, ~- u. _% c6 z0 a* V3 I: ]/ E
    數(shù)組中的每個元素都是指向函數(shù)的指針,這可以用于回調(diào)函數(shù)或?qū)崿F(xiàn)簡單的函數(shù)映射。
  • void (*func_array[])(int) = {func1, func2, func3};func_array[1](42); // 調(diào)用func2; E' ]7 p$ w# F6 Z6 g
    4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)
    1 h; w5 y7 N3 P0 a! v4 D3 u" A使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
  • struct Point {     int x, y;};
    ' u. D) d, w7 u; d2 ~3 ]void print_point(struct Point p) {   printf("(%d, %d)8 o# v# u$ P# B
    ", p.x, p.y);}
    2 W9 f2 a3 Q+ y9 Q6 f- c8 m- vstruct Point p = {1, 2};print_point(p);# X1 t: _  g7 N" A* F- O
    5. 靜態(tài)和動態(tài)內(nèi)存分配+ L( X3 n2 k) S& a
    使用 “malloc” 和 “free” 可以動態(tài)地分配和釋放內(nèi)存。
  • int *p = malloc(sizeof(int) * 10);/ v/ O, c9 t5 {& q
    if (p) {  for (int i = 0; i 10; i++) {    p = i * i;  }  free(p);}5 w( A* v" B- D: I1 j
    6. 復(fù)雜的遞歸8 i$ c2 q6 @' V
    遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。
  • int factorial(int n){    if (n 1) return 1;    return n * factorial(n - 1);}4 U. J2 I9 a% |' |7 @+ r+ _3 ?
    7. 位操作
    1 }) I; j1 l+ U/ G* l7 o) Z位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測試位的狀態(tài)。
  • int flags = 0x03; // 00000011flags |= 0x04;    // 00000101flags &= 0x01;    // 00000001flags ^= 0x01;    // 11111110! p, Y9 i% L" n+ e  S
    8. 復(fù)雜的條件編譯9 p3 O! ?. T1 T! W5 X! X% L' m
    預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。
  • #define DEBUG 1 int main() {     #if DEBUG     printf("Debug mode is on.
    % ]- p3 r+ ^& \+ }");     #endif     #ifdef DEBUG     // 調(diào)試代碼     #endif     return 0; }
    : O" c5 @, M0 ~9. 復(fù)雜的類型轉(zhuǎn)換
    6 c" s5 ~2 j, p' }, i3 V強制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問題。
  • double d = 3.14159;int *p = (int *)&d;printf("%d
    + a/ j' A6 w2 D+ P", *p); // 輸出整數(shù)部分,可能不安全
    - ^/ v! M0 B; Q$ t/ Z10. 使用"__attribute__"擴展
    , @- n1 D# p% ?; `"__attribute__"是GCC編譯器提供的擴展,可以用來控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。
  • void __attribute__((noreturn)) fatal_error(const char *msg) {    fprintf(stderr, "Fatal error: %s. j7 h" Q& Y8 ?9 o7 p; |
    ", msg);    exit(EXIT_FAILURE);}0 T& \* A% F9 N" ^* G
    這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時,應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。
    : g* l5 E% N* f  Z-END-7 Z) K, W- ]9 J) E, H5 v" W3 q+ t
    往期推薦:點擊圖片即可跳轉(zhuǎn)閱讀
    / V) i/ l+ l7 D

    ; [. i6 \* g, x" x0 N3 Q                                                        9 t1 ~# v1 \8 }0 \% i  \9 X9 k1 _% u
                                                                   
    5 T5 R) z2 s: `7 Y! W0 h                                                                       
    3 L7 j" n, f% @; d2 }: @  Q                                                                                6 o3 Q$ G0 ~0 K8 Q" [6 m
    / O+ I* s2 m4 G! v7 e$ M, X
                                                                                   
    " V6 _) p$ l/ M2 ^7 Y- [/ u* [                                                                                        被 char 類型的變量坑慘了!
    " R. D- B# X* M5 a) x- s8 p, h' U+ c! D                                                        4 l) P2 x. y6 v( T4 A  a# ]- g9 S( I
                                                                    3 }% k/ ?! e2 j+ Y8 K. _
                                                                           
    & y" P: ]' ~+ r                                                                               
    - {, \0 ]% h! m 5 x7 p1 B. c* N5 N
                                                                                   
    " a' `+ ]" z( r                                                                                        嵌入式 C 語言知識點,動態(tài)變長數(shù)組- B0 j: i6 n# o' e0 p
                                                           
    + Q7 n2 z0 M* M* ~  u3 B                                                                ( b6 p8 w: ]3 w3 G/ ]& b
                                                                           
      g+ T( S" F+ z. s; e3 M& s                                                                                9 H7 d% I; C/ U2 }; b

    % K7 o9 U1 Q# ?9 o                                                                                3 {; ^3 v: T* ^1 P( `( i
                                                                                            嵌入式 C 語言技巧,不完全類型
    3 G/ U9 `6 a, n7 w5 t8 L  o我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師0 u6 I; R9 o1 A# @+ s( d: R1 F6 r7 ^( g
    關(guān)注我,一起變得更加優(yōu)秀!
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表