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

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

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

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

[復(fù)制鏈接]

455

主題

455

帖子

849

積分

二級(jí)會(huì)員

Rank: 2

積分
849
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-20 17:50:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師7 M- @+ e3 }( J: m9 ^7 J' o
關(guān)注我,一起變得更加優(yōu)秀!6 k% \/ ?  E/ v0 _7 W9 i
在嵌入式軟件開發(fā)領(lǐng)域,C 語言是一種功能強(qiáng)大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。2 y) i# }  ^' P! ], t
以下是一些可能被認(rèn)為花哨的C語言特性及其示例:3 P) O7 u8 B# G! @
1. 宏定義的高級(jí)用法5 l  _& h. H: e4 I
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。
  • #define SQUARE(x) ((x) * (x))int a = 5;printf("%d3 j6 z7 {, k' u3 X5 B( i
    ", SQUARE(a++)); // 輸出25,但a的值會(huì)改變?yōu)?: H" i1 K4 L+ _
    2. 指針的指針
    7 x- Y7 u4 _" ]0 V4 j0 i指向指針的指針可以用于實(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  w" m3 T9 s2 k
    ", *(*(pptr + 1) + 1)); // 輸出46 G' _" g& |/ I6 j
    3. 函數(shù)指針數(shù)組
    2 D2 i: b. @2 v3 K9 Q& u數(shù)組中的每個(gè)元素都是指向函數(shù)的指針,這可以用于回調(diào)函數(shù)或?qū)崿F(xiàn)簡(jiǎn)單的函數(shù)映射。
  • void (*func_array[])(int) = {func1, func2, func3};func_array[1](42); // 調(diào)用func25 k5 ^/ r% p9 a& T8 d8 A
    4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)4 N  `3 h) W  n; W& n
    使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
  • struct Point {     int x, y;};
    : J4 g( e5 ^- q$ ]* i& v" hvoid print_point(struct Point p) {   printf("(%d, %d)& B! w1 d) Y+ B- }
    ", p.x, p.y);}: n8 g2 h/ C& B# E; h
    struct Point p = {1, 2};print_point(p);  \. E9 ~# i! X
    5. 靜態(tài)和動(dòng)態(tài)內(nèi)存分配
    6 U. d. W' \. |使用 “malloc” 和 “free” 可以動(dòng)態(tài)地分配和釋放內(nèi)存。
  • int *p = malloc(sizeof(int) * 10);7 q8 u- O# Q9 `  r
    if (p) {  for (int i = 0; i 10; i++) {    p = i * i;  }  free(p);}! f9 w  f, c' T% b
    6. 復(fù)雜的遞歸( ^4 s) Z! [! F/ E, ]1 {' |- W
    遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。
  • int factorial(int n){    if (n 1) return 1;    return n * factorial(n - 1);}
    , ]% `+ t* O$ w1 ?  W, n7. 位操作
      Y  G9 z* T! {, \位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測(cè)試位的狀態(tài)。
  • int flags = 0x03; // 00000011flags |= 0x04;    // 00000101flags &= 0x01;    // 00000001flags ^= 0x01;    // 11111110
    ' R/ f' f( C* {) Y$ I3 @8. 復(fù)雜的條件編譯) o! u! j8 e* @2 ^
    預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。
  • #define DEBUG 1 int main() {     #if DEBUG     printf("Debug mode is on.
    6 b& G# Z, i; t4 G  P' |");     #endif     #ifdef DEBUG     // 調(diào)試代碼     #endif     return 0; }  f/ i7 D& M) O8 X5 @3 ^: Q: s
    9. 復(fù)雜的類型轉(zhuǎn)換8 W- u% g( u5 l
    強(qiáng)制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問題。
  • double d = 3.14159;int *p = (int *)&d;printf("%d
    7 g' m$ i; i; D3 \. I% }0 z", *p); // 輸出整數(shù)部分,可能不安全
    & S' [: E& g6 E' f0 n10. 使用"__attribute__"擴(kuò)展
    ! T" P6 H4 V) |7 W1 ^"__attribute__"是GCC編譯器提供的擴(kuò)展,可以用來控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。
  • void __attribute__((noreturn)) fatal_error(const char *msg) {    fprintf(stderr, "Fatal error: %s
    # N6 z0 t% ?4 W" b6 J2 o", msg);    exit(EXIT_FAILURE);}
    % N$ r7 E4 @! C# r) G這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時(shí),應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。
    , d' k: d) n1 s  `( T" e-END-+ @, r; w  I% ^2 Q8 \
    往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀, [6 y. r) l, t: R8 c4 h

    , G  t3 _6 P1 _+ h4 _                                                        / ]6 v3 q2 o9 {" M5 s, C
                                                                   
    + F5 K; Z+ q# [! Z, A                                                                       
    9 _) F# i2 o- L8 N/ q( M                                                                               
    # ~5 y# A4 T  d4 N& @  k) S ! C. s$ o; w8 c& U: q6 k$ b! \" z
                                                                                    * G6 O! r/ V& k& ~* b$ N8 X
                                                                                            被 char 類型的變量坑慘了!# }% E0 @+ Y; I  K# P
                                                           
    # |/ `6 J  i! m6 o/ K3 c                                                               
    & ], w0 W4 o* g3 d- ~                                                                       
    3 X) }/ R% A5 {: x                                                                               
    % {5 l6 E1 |3 m! ]' ~- I. j , o4 M: Q( [/ o8 ~- O' g
                                                                                    7 P) m% Y, `* i+ X3 \/ v5 Z9 Z
                                                                                            嵌入式 C 語言知識(shí)點(diǎn),動(dòng)態(tài)變長(zhǎng)數(shù)組' S2 f2 ~+ \1 Q! t6 s! c( f
                                                           
    6 w1 e+ P' T3 z$ T                                                               
    % G+ t5 {& w$ T2 z! }" I3 F                                                                       
    / n$ L7 G* z( X, j3 k                                                                                3 f" L1 k; `( h8 n; r7 ~  F- D$ B; Z
    # @& @! |( R8 H0 ~3 I
                                                                                   
    : i" H9 x2 \: d# a7 d. I5 Y                                                                                        嵌入式 C 語言技巧,不完全類型: w, C$ x* F: O6 u* {
    我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師% p9 r% n$ G0 h% D0 x* k( y' Y
    關(guān)注我,一起變得更加優(yōu)秀!
  • 發(fā)表回復(fù)

    本版積分規(guī)則


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