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

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

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

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

[復制鏈接]

437

主題

437

帖子

96

積分

一級會員

Rank: 1

積分
96
跳轉到指定樓層
樓主
發(fā)表于 2024-8-20 17:50:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我是老溫,一名熱愛學習的嵌入式工程師# e  ]7 W: I' w1 J0 M7 m: K
關注我,一起變得更加優(yōu)秀!
, ]6 C7 |7 g2 A" l" d" W& A2 [( P在嵌入式軟件開發(fā)領域,C 語言是一種功能強大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。( Y; ^" U- R9 ]" S% o
以下是一些可能被認為花哨的C語言特性及其示例:7 F  z' J- d% f4 P, D+ ?1 D; @
1. 宏定義的高級用法6 Z) |7 S: n: ]/ Z1 m2 w2 ^
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。
  • #define SQUARE(x) ((x) * (x))int a = 5;printf("%d
    5 Z; X! k3 O7 w# E. m. r", SQUARE(a++)); // 輸出25,但a的值會改變?yōu)?6 }& e6 z. n( W% \, I  P) t5 M
    2. 指針的指針
    ( m7 X3 p1 n3 N5 Y& {. |5 U指向指針的指針可以用于實現(xiàn)復雜的數(shù)據(jù)結構,比如二維數(shù)組。
  • int **pptr;int arr[2][2] = {{1, 2}, {3, 4}};pptr = &arr[0];printf("%d
    8 H$ O" O0 Y1 E# Q! ?: [" L", *(*(pptr + 1) + 1)); // 輸出4/ `* K, a5 f9 e! j4 p4 U# d: N3 a
    3. 函數(shù)指針數(shù)組
    2 I3 z# K2 M; y+ `0 k( S數(shù)組中的每個元素都是指向函數(shù)的指針,這可以用于回調(diào)函數(shù)或實現(xiàn)簡單的函數(shù)映射。
  • void (*func_array[])(int) = {func1, func2, func3};func_array[1](42); // 調(diào)用func2
    , N: O6 p& {/ f3 U6 b: j4. 結構體和聯(lián)合體作為函數(shù)參數(shù)3 ?0 E: y* H# A
    使用結構體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復雜的數(shù)據(jù)結構。
  • struct Point {     int x, y;};
    * y( j) J# ]: Y6 X+ {void print_point(struct Point p) {   printf("(%d, %d)# n- [; [+ N. p
    ", p.x, p.y);}
    : \3 X5 K2 }; Tstruct Point p = {1, 2};print_point(p);2 H3 _3 k2 |3 t9 O) \
    5. 靜態(tài)和動態(tài)內(nèi)存分配; d! r+ M1 [9 G; _1 o, g. c
    使用 “malloc” 和 “free” 可以動態(tài)地分配和釋放內(nèi)存。
  • int *p = malloc(sizeof(int) * 10);  z# ~  t7 j: [$ F. ?1 C& g/ a* I4 [
    if (p) {  for (int i = 0; i 10; i++) {    p = i * i;  }  free(p);}
    ' M  m* t0 ^- Q; t6. 復雜的遞歸- ?& t6 f; x# l
    遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。
  • int factorial(int n){    if (n 1) return 1;    return n * factorial(n - 1);}' l3 F, U3 w) l+ k3 W3 g/ i
    7. 位操作( Q/ [4 w) [) m. |
    位操作可以用于設置、清除、翻轉、測試位的狀態(tài)。
  • int flags = 0x03; // 00000011flags |= 0x04;    // 00000101flags &= 0x01;    // 00000001flags ^= 0x01;    // 11111110
    " o7 M! o/ u; ~# U8. 復雜的條件編譯
    ( r) c( D# m3 `/ [! [, Q0 [預處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復雜的條件編譯。
  • #define DEBUG 1 int main() {     #if DEBUG     printf("Debug mode is on.
    6 ^: _2 N- T6 ?( r& Z");     #endif     #ifdef DEBUG     // 調(diào)試代碼     #endif     return 0; }$ y, Y0 b- {' l4 ]9 D
    9. 復雜的類型轉換
    5 Y3 s; |  P  M強制類型轉換可以用于將一種類型的數(shù)據(jù)轉換為另一種類型,但需要小心使用以避免問題。
  • double d = 3.14159;int *p = (int *)&d;printf("%d, j" W( w/ R5 ^+ w5 M- f
    ", *p); // 輸出整數(shù)部分,可能不安全
    5 |) m  i! ^, Q- j2 e10. 使用"__attribute__"擴展, T7 Z/ U4 `8 K' P0 x9 R3 e) P
    "__attribute__"是GCC編譯器提供的擴展,可以用來控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。
  • void __attribute__((noreturn)) fatal_error(const char *msg) {    fprintf(stderr, "Fatal error: %s2 ^; ^! n* l! {0 y
    ", msg);    exit(EXIT_FAILURE);}
    8 S1 X$ j4 U; f$ N  q這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護。因此,在使用這些特性時,應該權衡其利弊,并確保代碼的清晰性和可讀性。
    ! s" q' @/ ^4 C/ q9 \& c" |6 j2 O-END-
    / T& m' ?0 z6 j1 L/ f0 p  Q, ~* }往期推薦:點擊圖片即可跳轉閱讀
    7 `4 l& }. S: M  D4 o3 G1 r
    2 ]7 H# p) F" }0 E( F% ^, a
                                                           
    - |0 U& I  j2 Z9 {) l4 v7 a                                                                0 J$ R6 z& M+ \# W7 d) e
                                                                           
    * x+ t3 w: Z/ w6 q( Z: t& }  i                                                                               
    0 V* z/ b* g; h% e - y7 c8 w8 u% C: k1 ?
                                                                                   
    8 v1 l- {& \* p2 ?, I4 j                                                                                        被 char 類型的變量坑慘了!
    0 z) ?1 Z/ z. G  w7 ~" d+ B$ {                                                       
    & r1 ?; l" i! l* h. `  F                                                               
      b* n1 Y! R' D% Q5 L( t. E                                                                       
    & N; a0 |+ f7 F3 ~" b; @                                                                               
    - N+ w/ c6 a3 N7 B# ^ / T0 ^! x8 u0 S6 g  ~( b( s
                                                                                   
    ; ?0 A5 G* w  N1 c3 s                                                                                        嵌入式 C 語言知識點,動態(tài)變長數(shù)組
    7 z% b. q$ ]9 Y+ u                                                        % ^* U9 N0 b2 M3 D
                                                                   
    % R( Q# C  f1 B' Q" D9 u                                                                       
    ' o' V$ b# p# F& D4 t                                                                                * s( ~, U1 n$ U

      D; Q) d' n) v. O8 V/ r3 G                                                                               
    + g3 s0 ]9 U8 |3 p- R7 {                                                                                        嵌入式 C 語言技巧,不完全類型
    2 W  w0 O( H1 e. C我是老溫,一名熱愛學習的嵌入式工程師
    ( o" ~8 w; z; o* x, S. C0 J7 r9 s關注我,一起變得更加優(yōu)秀!
  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


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