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

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

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

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

[復(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í)的嵌入式工程師( V7 S: g1 M# h' ~: _& G2 N
關(guān)注我,一起變得更加優(yōu)秀!: H* T, ^! \7 f
在嵌入式軟件開發(fā)領(lǐng)域,C 語(yǔ)言是一種功能強(qiáng)大、靈活的編程語(yǔ)言,它提供了很多語(yǔ)法特性,有些語(yǔ)法可能看起來(lái)比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。3 G0 f6 y; G( h0 Z0 h
以下是一些可能被認(rèn)為花哨的C語(yǔ)言特性及其示例:( @  F' e4 S* x
1. 宏定義的高級(jí)用法' |) p  a- l0 P. G& C( V
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。
  • #define SQUARE(x) ((x) * (x))int a = 5;printf("%d
    . |( y+ S7 \9 A0 t* r7 s% f", SQUARE(a++)); // 輸出25,但a的值會(huì)改變?yōu)?
      E" @5 K. _: n# g# k2. 指針的指針
    ! L; d: F* @) I5 \指向指針的指針可以用于實(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  n3 G" C% @% M9 j: L. \2 V
    ", *(*(pptr + 1) + 1)); // 輸出40 D1 P8 H- W! f" _$ M: L
    3. 函數(shù)指針數(shù)組
    ! A: D" l3 n% O, L- ^% I8 b數(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)用func2
    1 x  M9 z9 E8 N. ]4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)
    0 R. c6 M+ |" p6 ^- }3 u& S使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
  • struct Point {     int x, y;};
    4 e1 w  B. m: g1 Q9 s) rvoid print_point(struct Point p) {   printf("(%d, %d)% Q: ?/ T0 ]8 V3 I" `. u' q
    ", p.x, p.y);}
    - L: H$ k% r9 `; ^5 f" Astruct Point p = {1, 2};print_point(p);# w1 Q- a& T, o' j) I! k' `
    5. 靜態(tài)和動(dòng)態(tài)內(nèi)存分配1 j; j3 m! o2 l% y* z
    使用 “malloc” 和 “free” 可以動(dòng)態(tài)地分配和釋放內(nèi)存。
  • int *p = malloc(sizeof(int) * 10);
    & B. a5 d4 v+ m5 v* @0 U$ rif (p) {  for (int i = 0; i 10; i++) {    p = i * i;  }  free(p);}
    / U* z7 V7 Q6 \7 N9 d6. 復(fù)雜的遞歸: E: J! h5 a: }7 S9 X
    遞歸函數(shù)可以用于解決分治問(wèn)題,但需要小心處理避免棧溢出。
  • int factorial(int n){    if (n 1) return 1;    return n * factorial(n - 1);}: @2 N  p0 e/ n4 Z; S$ u% K
    7. 位操作3 s6 M; y1 s% t1 m
    位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測(cè)試位的狀態(tài)。
  • int flags = 0x03; // 00000011flags |= 0x04;    // 00000101flags &= 0x01;    // 00000001flags ^= 0x01;    // 111111107 [* e  p& ~- L. ~7 ?' ?
    8. 復(fù)雜的條件編譯' W9 D* c1 \! `* y/ J2 {: X
    預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。
  • #define DEBUG 1 int main() {     #if DEBUG     printf("Debug mode is on.
    ) f1 y1 A6 f* p");     #endif     #ifdef DEBUG     // 調(diào)試代碼     #endif     return 0; }! `) x" b9 T. B$ l- R3 U4 l  W
    9. 復(fù)雜的類型轉(zhuǎn)換' {( x9 q" T0 U- W- u% C' v- k7 n
    強(qiáng)制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問(wèn)題。
  • double d = 3.14159;int *p = (int *)&d;printf("%d- U4 i  L+ F" T* f/ r
    ", *p); // 輸出整數(shù)部分,可能不安全
    - F2 a: a5 o, d5 e, \10. 使用"__attribute__"擴(kuò)展' W: Y- C* v6 ^
    "__attribute__"是GCC編譯器提供的擴(kuò)展,可以用來(lái)控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。
  • void __attribute__((noreturn)) fatal_error(const char *msg) {    fprintf(stderr, "Fatal error: %s' {, t) L: M0 @' T
    ", msg);    exit(EXIT_FAILURE);}8 f% p" t4 t& z/ h5 {3 y
    這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時(shí),應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。
    0 ?1 S7 m$ B  p-END-" k8 Y. r, @: a, U! z! X( p
    往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀
    6 J  s: E6 ~) s! r5 v! ~/ g' F. `
    ( D0 F1 l6 T7 c8 r& W
                                                           
    8 }. |" w' _5 B% H$ E0 G                                                                  P+ B; x) R" _6 a) ?) c2 W
                                                                           
    & K* e6 g! @( W8 S# Y( Y9 L                                                                               
    % j9 U5 S3 F; ?4 W + Q: `9 h; [% N" q* U# o: T
                                                                                   
    ( o1 H3 t9 |$ C( B& m% b                                                                                        被 char 類型的變量坑慘了!0 _. Z& D: @! u$ H+ ^. `
                                                              u: d, f7 ~- k
                                                                   
    6 c' M+ O2 R$ E6 e$ V                                                                        - m% [! }% O& _' x+ P
                                                                                   
    2 W% x2 ], f8 J/ x' w8 T# e4 e
    - H) ^- w1 m: ]( d+ i" f" V4 O                                                                               
    0 t7 V8 f5 q6 X+ Z2 L/ \/ C                                                                                        嵌入式 C 語(yǔ)言知識(shí)點(diǎn),動(dòng)態(tài)變長(zhǎng)數(shù)組5 [' f  [. K9 J, ?+ r0 M
                                                           
    $ q3 F1 V' W7 V. N( K! b                                                                7 G/ p5 N- W' k4 Z1 A( S, v2 F
                                                                            2 ^! d( [; K. [
                                                                                    7 U+ y  O! s# m$ H4 \

    $ ]! c+ l- z6 [                                                                                0 A4 G4 K/ J, w
                                                                                            嵌入式 C 語(yǔ)言技巧,不完全類型# R9 Z) z, S' e, z1 C" B
    我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
    % |0 @0 ?$ [3 |) ^0 d0 ?' I" e關(guān)注我,一起變得更加優(yōu)秀!
  • 發(fā)表回復(fù)

    本版積分規(guī)則


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