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

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

搜索
查看: 51|回復(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覽 |閱讀模式
我是老溫,一名熱愛(ài)學(xué)習(xí)的嵌入式工程師/ K# U" v9 [9 f2 ~9 ?/ j
關(guān)注我,一起變得更加優(yōu)秀!
' b. |6 T/ X5 T6 t- w' ?4 G在嵌入式軟件開(kāi)發(fā)領(lǐng)域,C 語(yǔ)言是一種功能強(qiáng)大、靈活的編程語(yǔ)言,它提供了很多語(yǔ)法特性,有些語(yǔ)法可能看起來(lái)比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。
- ~$ \! [: k. g; s+ h% X6 Z以下是一些可能被認(rèn)為花哨的C語(yǔ)言特性及其示例:
' T+ \: \$ T- I6 _! F* K, o1. 宏定義的高級(jí)用法
. ?! r  h  S9 H9 A  n使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。
  • #define SQUARE(x) ((x) * (x))int a = 5;printf("%d
      V+ B0 o2 j" ~3 C" _9 t", SQUARE(a++)); // 輸出25,但a的值會(huì)改變?yōu)?
    3 f# f( K* ^# N0 a- ~2. 指針的指針
    % H6 k% U8 q/ @5 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/ ?  {, l' [, s- W% c( a; a
    ", *(*(pptr + 1) + 1)); // 輸出4/ Y$ W, b6 b: B, }6 o  u2 x
    3. 函數(shù)指針數(shù)組; q/ g6 F0 m# r2 v
    數(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)用func28 o1 Y$ A6 r% ~( A5 j; [+ S
    4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)& {% h0 g2 o8 ~: u
    使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
  • struct Point {     int x, y;};
    . N% r/ D, P* D% Qvoid print_point(struct Point p) {   printf("(%d, %d)
    6 O. u9 M" u4 h", p.x, p.y);}3 m# w# F9 I5 {, q9 p) \, u2 s
    struct Point p = {1, 2};print_point(p);
    ( i" z4 Q7 x0 w8 g  H1 {) s6 ^' o4 v5. 靜態(tài)和動(dòng)態(tài)內(nèi)存分配! |: P; `8 m  I2 I4 @: J
    使用 “malloc” 和 “free” 可以動(dòng)態(tài)地分配和釋放內(nèi)存。
  • int *p = malloc(sizeof(int) * 10);
    + R, Z" {& g& |, G1 F* Xif (p) {  for (int i = 0; i 10; i++) {    p = i * i;  }  free(p);}$ }5 H0 V9 U8 V
    6. 復(fù)雜的遞歸
    ' O5 V* j: h: }) n* m+ o遞歸函數(shù)可以用于解決分治問(wèn)題,但需要小心處理避免棧溢出。
  • int factorial(int n){    if (n 1) return 1;    return n * factorial(n - 1);}; {1 C% w8 z6 a% Z1 }( f7 L
    7. 位操作, M  d5 `1 E2 G) G+ f
    位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測(cè)試位的狀態(tài)。
  • int flags = 0x03; // 00000011flags |= 0x04;    // 00000101flags &= 0x01;    // 00000001flags ^= 0x01;    // 11111110
    & Y' w! |, l. [4 x1 t8. 復(fù)雜的條件編譯7 M4 N+ `' {7 d/ [& O% j  o4 R! a
    預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。
  • #define DEBUG 1 int main() {     #if DEBUG     printf("Debug mode is on.
    6 ^) c, @9 z! c' f9 o1 g/ R7 c");     #endif     #ifdef DEBUG     // 調(diào)試代碼     #endif     return 0; }
    ' C; P3 l4 j4 f7 Q/ G- R0 H6 b1 _) }9. 復(fù)雜的類型轉(zhuǎn)換; A* K; Z0 z) V0 f
    強(qiáng)制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問(wèn)題。
  • double d = 3.14159;int *p = (int *)&d;printf("%d- K; M8 P9 `% `1 g& ]- y
    ", *p); // 輸出整數(shù)部分,可能不安全
    7 w9 e' {4 {& v5 A10. 使用"__attribute__"擴(kuò)展/ ?4 O. v0 @" F" r/ L, f5 h' `
    "__attribute__"是GCC編譯器提供的擴(kuò)展,可以用來(lái)控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。
  • void __attribute__((noreturn)) fatal_error(const char *msg) {    fprintf(stderr, "Fatal error: %s1 o9 D6 u- Y7 j4 o
    ", msg);    exit(EXIT_FAILURE);}
    4 u$ {2 m/ h: e; I6 V8 q這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時(shí),應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。& r- k5 i1 v! r6 s- D& q
    -END-+ O0 s& {4 r! J6 h
    往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀# `$ z) j5 W4 u

    ' g8 E8 ]9 m, a0 s  ^- b                                                        # S  e/ e4 q- E& w- d
                                                                   
    * ]0 b, G7 Q: d- N! P2 C8 M                                                                       
    3 D% u. s; Y* ]! k, {& T                                                                                & ?: L( b% g3 u; ~8 s6 q9 \& J
    . H( o: d; W* t: F( h1 i
                                                                                   
    / Y) q! w; P! D6 Z2 Q                                                                                        被 char 類型的變量坑慘了!2 k$ Y% \3 b: I& Z+ u
                                                            # N* J, {: C% q; `0 F
                                                                    2 J1 Y# ?3 b' N  j# y, C
                                                                           
    + `. S% L: d8 o: l" k, M+ X/ Q- y                                                                               
    % N4 }' C) F" }! I6 c, R6 q9 c % l- C4 {3 ?4 V+ g
                                                                                   
      n  {( }3 C- {& A3 n% g                                                                                        嵌入式 C 語(yǔ)言知識(shí)點(diǎn),動(dòng)態(tài)變長(zhǎng)數(shù)組
    & c5 Y" z- o1 @: M& d% R6 }# s                                                        2 C# Y% o5 M6 O# b7 o
                                                                    % A% h2 w, o) `$ ?/ R: g
                                                                           
    7 {4 i. b' c% ]) @5 S5 G/ h3 f                                                                               
    : w1 H- g% D8 \8 o/ F* Q2 S4 ? $ P4 b  \) x$ p6 V' H) d' R
                                                                                   
    / F. C9 a5 ^4 n  h3 G7 O( [                                                                                        嵌入式 C 語(yǔ)言技巧,不完全類型  a6 J3 R' t* H  I8 l6 A* ~
    我是老溫,一名熱愛(ài)學(xué)習(xí)的嵌入式工程師
    * n4 ?% w6 F! q7 u  a7 Z" M1 ?關(guān)注我,一起變得更加優(yōu)秀!
  • 發(fā)表回復(fù)

    本版積分規(guī)則


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