|
我是老溫,一名熱愛(à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
jfsb2x2p3kk64014417651.jpg (115.65 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
jfsb2x2p3kk64014417651.jpg
2024-9-18 11:13 上傳
. 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
kdkddzrfvxb64014417751.jpg (80.73 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
kdkddzrfvxb64014417751.jpg
2024-9-18 11:13 上傳
% 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 ?
4x21ulkz5gz64014417851.jpg (114.88 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
4x21ulkz5gz64014417851.jpg
2024-9-18 11:13 上傳
$ 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)秀! |
|