|
我是老溫,一名熱愛學(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
zxutw3fbims6401498359.jpg (115.65 KB, 下載次數(shù): 0)
下載附件
保存到相冊
zxutw3fbims6401498359.jpg
2024-9-15 11:18 上傳
) 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
ek2ydoxjhvg6401498459.jpg (80.73 KB, 下載次數(shù): 0)
下載附件
保存到相冊
ek2ydoxjhvg6401498459.jpg
2024-9-15 11:18 上傳
' ~" |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
pobfjwwxxlv6401498559.jpg (114.88 KB, 下載次數(shù): 0)
下載附件
保存到相冊
pobfjwwxxlv6401498559.jpg
2024-9-15 11:18 上傳
' 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)秀! |
|