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

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

搜索
查看: 163|回復: 0
收起左側

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

[復制鏈接]

455

主題

455

帖子

849

積分

二級會員

Rank: 2

積分
849
跳轉到指定樓層
樓主
發(fā)表于 2024-8-20 17:50:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我是老溫,一名熱愛學習的嵌入式工程師
( 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
    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
    " 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/ { " {/ 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)秀!
  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


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