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

PCB聯(lián)盟網

搜索
查看: 50|回復: 0
收起左側

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

[復制鏈接]

455

主題

455

帖子

849

積分

二級會員

Rank: 2

積分
849
跳轉到指定樓層
樓主
發(fā)表于 2024-8-20 17:50:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我是老溫,一名熱愛學習的嵌入式工程師
  j! K; L4 |) @+ e  Y* @" t3 M關注我,一起變得更加優(yōu)秀!
% C+ |$ m: g) U" R; t, v在嵌入式軟件開發(fā)領域,C 語言是一種功能強大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。
# {* S4 n8 x$ o3 u/ v以下是一些可能被認為花哨的C語言特性及其示例:
7 i" [9 o) r8 c0 E5 B1. 宏定義的高級用法; t' {7 h. H; m
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調試難度。
  • #define SQUARE(x) ((x) * (x))int a = 5;printf("%d
    ! d7 f  C# d  _$ e) g" h", SQUARE(a++)); // 輸出25,但a的值會改變?yōu)?3 |2 T! q3 f) s+ E% |. p
    2. 指針的指針
    / i# d5 J: t7 w  L2 e指向指針的指針可以用于實現(xiàn)復雜的數(shù)據(jù)結構,比如二維數(shù)組。
  • int **pptr;int arr[2][2] = {{1, 2}, {3, 4}};pptr = &arr[0];printf("%d9 P- W' s8 a* Q) v* l  z
    ", *(*(pptr + 1) + 1)); // 輸出4
    / q1 R, c; i/ e0 F7 q  k3. 函數(shù)指針數(shù)組
    , s+ C/ W8 `3 L; x數(shù)組中的每個元素都是指向函數(shù)的指針,這可以用于回調函數(shù)或實現(xiàn)簡單的函數(shù)映射。
  • void (*func_array[])(int) = {func1, func2, func3};func_array[1](42); // 調用func2
    * E$ v2 b" @6 C1 x2 O2 Z4. 結構體和聯(lián)合體作為函數(shù)參數(shù)2 ~! P/ A. _& l7 t6 h3 \
    使用結構體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復雜的數(shù)據(jù)結構。
  • struct Point {     int x, y;};
    / t% @1 Q9 q+ W+ L4 \void print_point(struct Point p) {   printf("(%d, %d)
    * S# X# z6 K/ \  ^", p.x, p.y);}  V# C" l( M5 I- ]6 ^1 d) t2 F
    struct Point p = {1, 2};print_point(p);8 l' f$ S& h* x+ G1 N: @9 C
    5. 靜態(tài)和動態(tài)內存分配( m  B4 b1 g. K
    使用 “malloc” 和 “free” 可以動態(tài)地分配和釋放內存。
  • int *p = malloc(sizeof(int) * 10);6 N9 F% u9 [# l
    if (p) {  for (int i = 0; i 10; i++) {    p = i * i;  }  free(p);}" S8 o+ w4 O. g: m6 `+ k
    6. 復雜的遞歸
    / ^* P4 _% w/ S/ I, Q: C遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。
  • int factorial(int n){    if (n 1) return 1;    return n * factorial(n - 1);}+ M" r! t  M! ^, T& A, {
    7. 位操作
    & U. ]5 i' j. w  R, R$ l* ]8 z位操作可以用于設置、清除、翻轉、測試位的狀態(tài)。
  • int flags = 0x03; // 00000011flags |= 0x04;    // 00000101flags &= 0x01;    // 00000001flags ^= 0x01;    // 11111110
    6 V0 E- K& U3 j8. 復雜的條件編譯
    6 d1 ?' ~) P8 f預處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復雜的條件編譯。
  • #define DEBUG 1 int main() {     #if DEBUG     printf("Debug mode is on.' V4 t: L! D2 e
    ");     #endif     #ifdef DEBUG     // 調試代碼     #endif     return 0; }7 `$ |- W" i2 _# s, W
    9. 復雜的類型轉換+ z5 y( Y+ L7 B* Z
    強制類型轉換可以用于將一種類型的數(shù)據(jù)轉換為另一種類型,但需要小心使用以避免問題。
  • double d = 3.14159;int *p = (int *)&d;printf("%d2 l1 P7 ?! t2 _2 N4 q1 i
    ", *p); // 輸出整數(shù)部分,可能不安全- a  g" n2 d1 K- L
    10. 使用"__attribute__"擴展
    ' z! o" S7 n2 D, X* b"__attribute__"是GCC編譯器提供的擴展,可以用來控制函數(shù)的調用約定、內聯(lián)等。
  • void __attribute__((noreturn)) fatal_error(const char *msg) {    fprintf(stderr, "Fatal error: %s
    # n. }3 ^7 n7 [", msg);    exit(EXIT_FAILURE);}# ?- p+ @3 E, g  @6 ~* x# z; |+ ]
    這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護。因此,在使用這些特性時,應該權衡其利弊,并確保代碼的清晰性和可讀性。# y) [' `/ f0 s
    -END-
    + G% y0 _0 I8 x往期推薦:點擊圖片即可跳轉閱讀2 z* \1 O6 H: G) g
    3 O! W4 z& p! s' v% j0 q
                                                           
    9 Y2 L& O/ y3 Z8 S/ V4 H: ?- i                                                               
    8 Y; y8 g( ^4 V5 T0 o7 ^$ m                                                                       
    + A; u1 ~/ j2 G" P                                                                                - G1 T. c4 q& H& m1 E2 O- J

    : Y1 J( F/ ^$ }9 ?$ `: }+ {                                                                               
    % ^; _+ B; Z! D) x. R& o                                                                                        被 char 類型的變量坑慘了!
    0 K  j& I3 E2 I7 D                                                        5 R" N5 ~, H4 j5 A
                                                                    # _* R2 n7 {) G
                                                                           
    4 W% A" a+ q- _- n                                                                                4 \) S" ~/ v6 p

      u/ J  N# t, K3 L. e                                                                               
    . C# S- b* b$ Z; p, X( z. _1 Y                                                                                        嵌入式 C 語言知識點,動態(tài)變長數(shù)組
    3 [; J% k$ z5 l/ ?, l6 P                                                       
    ) ]/ s+ d4 l7 [2 J3 c# |                                                                % M3 A+ U% e9 Q1 v4 R( A
                                                                           
    ! w/ \+ G! s3 C3 D, f                                                                                9 u% C1 N) A+ U$ B# y" n7 c* \

    & @/ ~( _( v2 C2 ^2 s                                                                                * k- U) B5 f4 J+ W
                                                                                            嵌入式 C 語言技巧,不完全類型% F* I% y8 \+ U  ?, M
    我是老溫,一名熱愛學習的嵌入式工程師
    * w3 G7 B' m9 @0 {) l關注我,一起變得更加優(yōu)秀!
  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


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