|
我是老溫,一名熱愛學習的嵌入式工程師
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
sgogm5vmsne6405221111.jpg (115.65 KB, 下載次數(shù): 1)
下載附件
保存到相冊
sgogm5vmsne6405221111.jpg
2024-8-21 13:01 上傳
: 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
vjr3xrt04wc6405221211.jpg (80.73 KB, 下載次數(shù): 0)
下載附件
保存到相冊
vjr3xrt04wc6405221211.jpg
2024-8-21 13:01 上傳
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* \
apww11dsv2o6405221311.jpg (114.88 KB, 下載次數(shù): 0)
下載附件
保存到相冊
apww11dsv2o6405221311.jpg
2024-8-21 13:01 上傳
& @/ ~( _( v2 C2 ^2 s * k- U) B5 f4 J+ W
嵌入式 C 語言技巧,不完全類型% F* I% y8 \+ U ?, M
我是老溫,一名熱愛學習的嵌入式工程師
* w3 G7 B' m9 @0 {) l關注我,一起變得更加優(yōu)秀! |
|