|
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師7 M- @+ e3 }( J: m9 ^7 J' o
關(guān)注我,一起變得更加優(yōu)秀!6 k% \/ ? E/ v0 _7 W9 i
在嵌入式軟件開發(fā)領(lǐng)域,C 語言是一種功能強(qiáng)大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。2 y) i# } ^' P! ], t
以下是一些可能被認(rèn)為花哨的C語言特性及其示例:3 P) O7 u8 B# G! @
1. 宏定義的高級(jí)用法5 l _& h. H: e4 I
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。#define SQUARE(x) ((x) * (x))int a = 5;printf("%d3 j6 z7 {, k' u3 X5 B( i
", SQUARE(a++)); // 輸出25,但a的值會(huì)改變?yōu)?: H" i1 K4 L+ _
2. 指針的指針
7 x- Y7 u4 _" ]0 V4 j0 i指向指針的指針可以用于實(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 w" m3 T9 s2 k
", *(*(pptr + 1) + 1)); // 輸出46 G' _" g& |/ I6 j
3. 函數(shù)指針數(shù)組
2 D2 i: b. @2 v3 K9 Q& u數(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)用func25 k5 ^/ r% p9 a& T8 d8 A
4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)4 N `3 h) W n; W& n
使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。struct Point { int x, y;};
: J4 g( e5 ^- q$ ]* i& v" hvoid print_point(struct Point p) { printf("(%d, %d)& B! w1 d) Y+ B- }
", p.x, p.y);}: n8 g2 h/ C& B# E; h
struct Point p = {1, 2};print_point(p); \. E9 ~# i! X
5. 靜態(tài)和動(dòng)態(tài)內(nèi)存分配
6 U. d. W' \. |使用 “malloc” 和 “free” 可以動(dòng)態(tài)地分配和釋放內(nèi)存。int *p = malloc(sizeof(int) * 10);7 q8 u- O# Q9 ` r
if (p) { for (int i = 0; i 10; i++) { p = i * i; } free(p);}! f9 w f, c' T% b
6. 復(fù)雜的遞歸( ^4 s) Z! [! F/ E, ]1 {' |- W
遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。int factorial(int n){ if (n 1) return 1; return n * factorial(n - 1);}
, ]% `+ t* O$ w1 ? W, n7. 位操作
Y G9 z* T! {, \位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測(cè)試位的狀態(tài)。int flags = 0x03; // 00000011flags |= 0x04; // 00000101flags &= 0x01; // 00000001flags ^= 0x01; // 11111110
' R/ f' f( C* {) Y$ I3 @8. 復(fù)雜的條件編譯) o! u! j8 e* @2 ^
預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。 #define DEBUG 1 int main() { #if DEBUG printf("Debug mode is on.
6 b& G# Z, i; t4 G P' |"); #endif #ifdef DEBUG // 調(diào)試代碼 #endif return 0; } f/ i7 D& M) O8 X5 @3 ^: Q: s
9. 復(fù)雜的類型轉(zhuǎn)換8 W- u% g( u5 l
強(qiáng)制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問題。double d = 3.14159;int *p = (int *)&d;printf("%d
7 g' m$ i; i; D3 \. I% }0 z", *p); // 輸出整數(shù)部分,可能不安全
& S' [: E& g6 E' f0 n10. 使用"__attribute__"擴(kuò)展
! T" P6 H4 V) |7 W1 ^"__attribute__"是GCC編譯器提供的擴(kuò)展,可以用來控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。void __attribute__((noreturn)) fatal_error(const char *msg) { fprintf(stderr, "Fatal error: %s
# N6 z0 t% ?4 W" b6 J2 o", msg); exit(EXIT_FAILURE);}
% N$ r7 E4 @! C# r) G這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時(shí),應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。
, d' k: d) n1 s `( T" e-END-+ @, r; w I% ^2 Q8 \
往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀, [6 y. r) l, t: R8 c4 h
, G t3 _6 P1 _+ h4 _ / ]6 v3 q2 o9 {" M5 s, C
+ F5 K; Z+ q# [! Z, A
9 _) F# i2 o- L8 N/ q( M
# ~5 y# A4 T d4 N& @ k) S
q2ypusfia1u64012766237.jpg (115.65 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
q2ypusfia1u64012766237.jpg
2024-9-9 11:14 上傳
! C. s$ o; w8 c& U: q6 k$ b! \" z
* G6 O! r/ V& k& ~* b$ N8 X
被 char 類型的變量坑慘了!# }% E0 @+ Y; I K# P
# |/ `6 J i! m6 o/ K3 c
& ], w0 W4 o* g3 d- ~
3 X) }/ R% A5 {: x
% {5 l6 E1 |3 m! ]' ~- I. j
foyos2k2qm264012766337.jpg (80.73 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
foyos2k2qm264012766337.jpg
2024-9-9 11:14 上傳
, o4 M: Q( [/ o8 ~- O' g
7 P) m% Y, `* i+ X3 \/ v5 Z9 Z
嵌入式 C 語言知識(shí)點(diǎn),動(dòng)態(tài)變長(zhǎng)數(shù)組' S2 f2 ~+ \1 Q! t6 s! c( f
6 w1 e+ P' T3 z$ T
% G+ t5 {& w$ T2 z! }" I3 F
/ n$ L7 G* z( X, j3 k 3 f" L1 k; `( h8 n; r7 ~ F- D$ B; Z
ompjyfj4dfb64012766437.jpg (114.88 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
ompjyfj4dfb64012766437.jpg
2024-9-9 11:14 上傳
# @& @! |( R8 H0 ~3 I
: i" H9 x2 \: d# a7 d. I5 Y 嵌入式 C 語言技巧,不完全類型: w, C$ x* F: O6 u* {
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師% p9 r% n$ G0 h% D0 x* k( y' Y
關(guān)注我,一起變得更加優(yōu)秀! |
|