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

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

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

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

[復(fù)制鏈接]

455

主題

455

帖子

849

積分

二級會員

Rank: 2

積分
849
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-20 17:50:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
1 h, z% q9 x$ n關(guān)注我,一起變得更加優(yōu)秀!
! m: F  Q; R7 v% Q0 H8 \- f1 e% e% H在嵌入式軟件開發(fā)領(lǐng)域,C 語言是一種功能強(qiáng)大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。
. M( a1 I( k+ Q, l  J以下是一些可能被認(rèn)為花哨的C語言特性及其示例:
/ }2 q- K) r6 r9 Q- y/ z( n$ j1. 宏定義的高級用法/ Q/ t+ P  a1 B( w* M4 ~% C
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。
  • #define SQUARE(x) ((x) * (x))int a = 5;printf("%d$ C# m% r- w- S! Q' G4 R
    ", SQUARE(a++)); // 輸出25,但a的值會改變?yōu)?
    3 W" ?) n: c+ b2. 指針的指針  W: y6 M' p# j; g$ q# c; A8 B% z
    指向指針的指針可以用于實(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
    + T9 L$ u7 M8 C& \5 b& Q; a", *(*(pptr + 1) + 1)); // 輸出4# A8 {0 z. u' [8 b4 }' T
    3. 函數(shù)指針數(shù)組) w$ g+ {& R! j0 q5 t4 `
    數(shù)組中的每個(gè)元素都是指向函數(shù)的指針,這可以用于回調(diào)函數(shù)或?qū)崿F(xiàn)簡單的函數(shù)映射。
  • void (*func_array[])(int) = {func1, func2, func3};func_array[1](42); // 調(diào)用func2
    2 }; @* o: p1 e, c5 b4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)
    $ J+ B" l6 O# T: w  ]7 i% T使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
  • struct Point {     int x, y;};
    8 x+ g6 r6 s* t& mvoid print_point(struct Point p) {   printf("(%d, %d)
    6 T4 p3 E6 e. d- a0 w; y# i0 v", p.x, p.y);}4 `3 U; z/ f' m6 i9 c8 j2 G
    struct Point p = {1, 2};print_point(p);* \+ G8 d9 H& _  a5 p
    5. 靜態(tài)和動(dòng)態(tài)內(nèi)存分配3 m. J! c6 N9 y
    使用 “malloc” 和 “free” 可以動(dòng)態(tài)地分配和釋放內(nèi)存。
  • int *p = malloc(sizeof(int) * 10);& Q% S* p1 O% r: H- M) |) u  R
    if (p) {  for (int i = 0; i 10; i++) {    p = i * i;  }  free(p);}9 d( _% q/ A5 b( }9 |& k1 P( n
    6. 復(fù)雜的遞歸
    ( Z: V% Z" R  t9 G7 j1 j" U3 q遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。
  • int factorial(int n){    if (n 1) return 1;    return n * factorial(n - 1);}
    0 r) t8 \& C( R4 ]; I5 q1 s: B* X7. 位操作
    ( A, [/ i- R: K$ L0 ^位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測試位的狀態(tài)。
  • int flags = 0x03; // 00000011flags |= 0x04;    // 00000101flags &= 0x01;    // 00000001flags ^= 0x01;    // 11111110
    4 Y7 n7 }. r$ m/ e: O  E8. 復(fù)雜的條件編譯
    : L  M" v6 M6 @2 p' i; W" o預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。
  • #define DEBUG 1 int main() {     #if DEBUG     printf("Debug mode is on.
    % X. b; }# G7 g% [$ d3 f");     #endif     #ifdef DEBUG     // 調(diào)試代碼     #endif     return 0; }4 c7 J( ?5 U8 p8 @
    9. 復(fù)雜的類型轉(zhuǎn)換
    - v# {& Z: l- \& {/ a強(qiáng)制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問題。
  • double d = 3.14159;int *p = (int *)&d;printf("%d
    1 j+ q. u9 p( E' M", *p); // 輸出整數(shù)部分,可能不安全
    1 l# h! T& \  `7 M10. 使用"__attribute__"擴(kuò)展, L" {9 j& A! s8 Z  H
    "__attribute__"是GCC編譯器提供的擴(kuò)展,可以用來控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。
  • void __attribute__((noreturn)) fatal_error(const char *msg) {    fprintf(stderr, "Fatal error: %s
    8 r( G$ b- P7 h$ h7 e" U( H", msg);    exit(EXIT_FAILURE);}
    7 _8 C' S" r/ y- q' |這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時(shí),應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。
    . O: [5 I4 k/ b! w6 j+ J8 p3 ?-END-8 `! J8 D% z. _: e0 \: `
    往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀; G; I4 r0 f4 `" a; @

    / t5 D9 j5 T, d/ g; q                                                       
    3 U7 p" ?% A) n' a3 ^                                                                + m/ X1 W8 `3 A! @* f# [* F: T
                                                                            ( I1 o& |8 G9 S8 l
                                                                                    + q" r6 e' m. [; m# l* I
    & \* l3 |7 p8 p5 }7 @! D
                                                                                   
    2 b) P! S$ f4 q: I8 n) ~5 g                                                                                        被 char 類型的變量坑慘了!/ n. B6 F* L5 P
                                                           
    - u) R* l) J+ C  q                                                                . i5 y4 J3 f8 Q
                                                                            ; P$ {8 Y( M+ X4 N- _9 W
                                                                                    ) L1 p1 |! S2 y; v

    * S1 B, j* {2 I& B& h* i                                                                               
    4 O" m' P# f5 y$ ]4 Z1 S                                                                                        嵌入式 C 語言知識點(diǎn),動(dòng)態(tài)變長數(shù)組
    . `/ ]# {3 l6 ?' A                                                       
    - g9 `3 w% `) u/ z                                                                7 A4 E. H- }0 N' g
                                                                            . L; W" g, J3 }  g0 X# M4 U
                                                                                   
    % d- w- n" x9 B5 x/ y+ d* z
    5 c" `3 \6 o5 R* _" I2 ^                                                                                , a+ r6 O2 x/ l' o8 |1 J
                                                                                            嵌入式 C 語言技巧,不完全類型
    6 h: ^4 K4 @% o/ n# t8 r7 ~6 v我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
    ( T% V4 g8 P* V$ ]6 \  ~& ], c" @關(guān)注我,一起變得更加優(yōu)秀!
  • 發(fā)表回復(fù)

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

    本版積分規(guī)則


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