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

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

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

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

[復(fù)制鏈接]

437

主題

437

帖子

96

積分

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

Rank: 1

積分
96
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-20 17:50:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
$ [: f- _. y7 G5 W" ?關(guān)注我,一起變得更加優(yōu)秀!
  z- D7 K: f* c+ G* ^- ~: g8 C8 W7 z在嵌入式軟件開發(fā)領(lǐng)域,C 語言是一種功能強(qiáng)大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。- S# M% f- y9 r3 |
以下是一些可能被認(rèn)為花哨的C語言特性及其示例:
. w0 ^7 u! L% F* v7 i1. 宏定義的高級(jí)用法/ ~, O: Y- G1 ?
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。
  • #define SQUARE(x) ((x) * (x))int a = 5;printf("%d: w9 k0 u% }6 b( I
    ", SQUARE(a++)); // 輸出25,但a的值會(huì)改變?yōu)?
    1 ^7 \) o6 x" `* k9 q+ x# U# I3 E2. 指針的指針, d% L$ t) B, e9 H4 x; h
    指向指針的指針可以用于實(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. t) |/ [7 J- o! u
    ", *(*(pptr + 1) + 1)); // 輸出4& F8 j+ G' p( D
    3. 函數(shù)指針數(shù)組
    4 R" ?$ `! g, m' d) G) h' X數(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
    0 s/ n1 n' K' c) |; X3 V( s4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)
    9 B3 A) F3 I& R& E/ ]4 `使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
  • struct Point {     int x, y;};
    ! |+ k7 N, L# @; J- P  kvoid print_point(struct Point p) {   printf("(%d, %d)3 `( a, L3 o) _; b
    ", p.x, p.y);}
    ; z6 n9 ?0 {0 `. K) V& Q" ustruct Point p = {1, 2};print_point(p);2 E" J* B" j! k
    5. 靜態(tài)和動(dòng)態(tài)內(nèi)存分配
    ! s4 M" a& ^' [# W9 n* Y/ r使用 “malloc” 和 “free” 可以動(dòng)態(tài)地分配和釋放內(nèi)存。
  • int *p = malloc(sizeof(int) * 10);
    + d3 W0 Y' g3 T- L  }9 rif (p) {  for (int i = 0; i 10; i++) {    p = i * i;  }  free(p);}; a0 l8 x) |2 z& W5 ]
    6. 復(fù)雜的遞歸
    . U( Z$ H2 i' M# G! q# h: P遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。
  • int factorial(int n){    if (n 1) return 1;    return n * factorial(n - 1);}
    ' e) D% s# L* U  ]/ O* o1 {( e7. 位操作9 a, p4 D0 m9 Z9 t$ e; J
    位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測試位的狀態(tài)。
  • int flags = 0x03; // 00000011flags |= 0x04;    // 00000101flags &= 0x01;    // 00000001flags ^= 0x01;    // 11111110( l9 K6 p  l2 l; B
    8. 復(fù)雜的條件編譯, ?- [( z" P5 P5 k. |
    預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。
  • #define DEBUG 1 int main() {     #if DEBUG     printf("Debug mode is on.
    9 L+ [8 K$ a4 |$ w2 a) v& t/ P( `");     #endif     #ifdef DEBUG     // 調(diào)試代碼     #endif     return 0; }) j7 [+ i. B2 i) J
    9. 復(fù)雜的類型轉(zhuǎn)換
    % q3 k3 z" w/ O強(qiáng)制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問題。
  • double d = 3.14159;int *p = (int *)&d;printf("%d! t! q% f& o+ A. o& c
    ", *p); // 輸出整數(shù)部分,可能不安全0 `# D. X/ l" t" }% [: s
    10. 使用"__attribute__"擴(kuò)展3 h# T% B4 f& P: `1 l6 ]- v
    "__attribute__"是GCC編譯器提供的擴(kuò)展,可以用來控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。
  • void __attribute__((noreturn)) fatal_error(const char *msg) {    fprintf(stderr, "Fatal error: %s& z9 i+ a* `0 W* M
    ", msg);    exit(EXIT_FAILURE);}
    $ q/ N5 X) N6 G: s/ V5 O1 V這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時(shí),應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。
    , |  `5 g+ k( F! W6 M  ]# X/ E-END-
    9 n! z& ~3 I2 @4 P往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀* L* l* B& z! q
    " r) W; k# J& Y/ _/ T0 |+ j
                                                            . w/ `& v, `' Y3 e4 t
                                                                   
    ! \) U, J. l% I. q4 S2 v                                                                       
    $ v1 f+ _4 K7 B  h( f! M* a                                                                               
    ! O. R; ]4 i+ O$ z- Q
    ' d# q0 V1 T% l- [                                                                               
    $ _3 _# h- _( n+ z9 B4 R                                                                                        被 char 類型的變量坑慘了!9 z. y, _, ^9 |% r" y. {# D
                                                            7 [% y  C3 T9 Y# V6 O! v
                                                                    & F5 s( Q& D: W+ y, t9 ~
                                                                            7 t! ~1 V3 _$ B$ k
                                                                                   
    8 I$ T0 A* v# j) l: ?  g 4 O! a: f) r. _/ O
                                                                                    - ]4 j& g$ q) C+ ?- J$ S
                                                                                            嵌入式 C 語言知識(shí)點(diǎn),動(dòng)態(tài)變長數(shù)組" g/ Q3 o* a$ \
                                                            7 x" I8 g7 y! D% W. f
                                                                   
    ) c- i; V0 _2 j& m6 N                                                                        & |" N' e4 g  I9 v3 C+ Y- y; @) S
                                                                                   
    3 b. ]0 l! f( P' k" Q2 ?5 z* m . {6 S+ H$ t% O4 ]/ P, {
                                                                                    * C$ A* f  L  J$ C
                                                                                            嵌入式 C 語言技巧,不完全類型
    # Q. T6 R* m. v* w3 H; k我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師, _; r3 `! o" F  X7 D
    關(guān)注我,一起變得更加優(yōu)秀!
  • 發(fā)表回復(fù)

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

    本版積分規(guī)則


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