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

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

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

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

[復(fù)制鏈接]

455

主題

455

帖子

849

積分

二級會員

Rank: 2

積分
849
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-20 17:50:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師, p0 \" m3 i6 j( c7 e/ D
關(guān)注我,一起變得更加優(yōu)秀!
6 M- s5 m$ }7 {% O在嵌入式軟件開發(fā)領(lǐng)域,C 語言是一種功能強(qiáng)大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。' J" W+ i: x/ ?! a
以下是一些可能被認(rèn)為花哨的C語言特性及其示例:
2 _$ w7 ~5 {0 x8 m1. 宏定義的高級用法- l2 |! f2 N4 D
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。
  • #define SQUARE(x) ((x) * (x))int a = 5;printf("%d' z  A" |, R+ M5 n
    ", SQUARE(a++)); // 輸出25,但a的值會改變?yōu)?
    6 X! @6 \0 ]  q3 v2. 指針的指針
    7 b; [" T% P8 C4 O' B, V指向指針的指針可以用于實(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( N) ?% ]' W' H8 I$ D3 t+ N
    ", *(*(pptr + 1) + 1)); // 輸出4* O. q( e5 U) m6 u. q* B& [
    3. 函數(shù)指針數(shù)組6 f" W4 _4 f& }* B& o% H
    數(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
      F: ^( z/ V+ S+ v5 Z4 @+ z6 O4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)
    7 D( E9 C# w! ^1 N$ k  F使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
  • struct Point {     int x, y;};
    . j" [, r: i. w5 g6 |void print_point(struct Point p) {   printf("(%d, %d)
    + O; l9 D+ X/ l3 I2 ?7 m4 X", p.x, p.y);}) V( Z" ^# y4 q9 Z0 ^) j$ B
    struct Point p = {1, 2};print_point(p);
      o# u7 M$ m9 P8 G5 D  M4 _) ~5. 靜態(tài)和動態(tài)內(nèi)存分配
    5 |# P3 H/ Q2 ^* i使用 “malloc” 和 “free” 可以動態(tài)地分配和釋放內(nèi)存。
  • int *p = malloc(sizeof(int) * 10);
    6 M3 |: l+ @, s8 p  L' Mif (p) {  for (int i = 0; i 10; i++) {    p = i * i;  }  free(p);}
    7 P* `1 W/ z3 O# s0 u1 V/ d6. 復(fù)雜的遞歸
    " @! J8 L2 v' j遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。
  • int factorial(int n){    if (n 1) return 1;    return n * factorial(n - 1);}
    " f9 z# S" j, h* Z7. 位操作  ~2 Q: b, I8 o* T) }% }  I% P
    位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測試位的狀態(tài)。
  • int flags = 0x03; // 00000011flags |= 0x04;    // 00000101flags &= 0x01;    // 00000001flags ^= 0x01;    // 11111110
    ! L0 Q: d. \  m1 F8. 復(fù)雜的條件編譯
    0 U8 r* F, F' B! |7 U1 Q9 @預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。
  • #define DEBUG 1 int main() {     #if DEBUG     printf("Debug mode is on.2 z' W1 x6 z& W# P7 I) J1 [5 a3 F
    ");     #endif     #ifdef DEBUG     // 調(diào)試代碼     #endif     return 0; }
    1 `* `6 r* F; {: \4 Q7 n5 e4 F* s9. 復(fù)雜的類型轉(zhuǎn)換
    * y: ?3 _& [4 S, s+ A. v強(qiáng)制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問題。
  • double d = 3.14159;int *p = (int *)&d;printf("%d9 @  p8 O. f( v% Z0 y  y
    ", *p); // 輸出整數(shù)部分,可能不安全" v2 _& `$ Y6 U. m( x9 B# z
    10. 使用"__attribute__"擴(kuò)展
    8 Z5 f: K4 [9 m1 B5 j"__attribute__"是GCC編譯器提供的擴(kuò)展,可以用來控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。
  • void __attribute__((noreturn)) fatal_error(const char *msg) {    fprintf(stderr, "Fatal error: %s
    2 a3 \( U3 A2 S) x5 y9 a( L", msg);    exit(EXIT_FAILURE);}3 [) U! {9 \3 D( J8 H
    這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時(shí),應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。, S, {* F, ~9 G% O
    -END-
    . W5 x! P/ i- @% d6 w$ T往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀
    5 \7 a9 @, F  O2 Y1 R, H  e

    : x3 J% ?1 O7 j" i5 J7 Y                                                        8 b8 T8 j/ B" d; u4 k
                                                                    " r; p* b& q/ b
                                                                           
    / |3 w' g' O$ D9 J7 n/ T4 d                                                                               
    $ S1 V8 g; r0 H
    ) L! Z2 M5 {% C9 p" r8 L# n& G                                                                               
    - t3 F- O- n" F- ?; I                                                                                        被 char 類型的變量坑慘了!! E. p  o4 H5 v7 Y2 Q: Z. v  S
                                                            ! j7 {' Q/ _- h- a
                                                                    5 Y) g; X) O4 o- Y! ^3 v4 v
                                                                            5 {9 Q# m1 q' W5 t- {
                                                                                   
    0 a% o; D2 P1 D
    ' ~" |0 n- A9 B% W8 O                                                                               
    0 b8 s8 H! a) S, M) Z/ g6 q- W                                                                                        嵌入式 C 語言知識點(diǎn),動態(tài)變長數(shù)組
    . v  J4 U6 @3 A1 s; ^7 i# G                                                        / `; ~4 S( B, W7 c7 [. z' n
                                                                    " b% V5 r- d7 L0 G$ {
                                                                           
    & R7 o& Z) [: M                                                                                & e. s' _* b2 f( o- J' l- D3 H1 ?/ S
    ' X1 C6 D# F! c; R7 L' y; \8 Y; J
                                                                                   
    3 b8 z8 d1 [8 y& A& }) C) y( r                                                                                        嵌入式 C 語言技巧,不完全類型- V* T" p  K9 U: s4 p
    我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
    ' p: u5 B+ S& p3 t/ n關(guān)注我,一起變得更加優(yōu)秀!
  • 發(fā)表回復(fù)

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

    本版積分規(guī)則


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