|
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
1 h, z% q9 x$ n關(guān)注我,一起變得更加優(yōu)秀!
! m: F Q; R7 v% Q0 H8 \- f1 e% e% H在嵌入式軟件開發(fā)領(lǐng)域,C 語言是一種功能強(qiáng)大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。
. M( a1 I( k+ Q, l J以下是一些可能被認(rèn)為花哨的C語言特性及其示例:
/ }2 q- K) r6 r9 Q- y/ z( n$ j1. 宏定義的高級用法/ Q/ t+ P a1 B( w* M4 ~% C
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。#define SQUARE(x) ((x) * (x))int a = 5;printf("%d$ C# m% r- w- S! Q' G4 R
", SQUARE(a++)); // 輸出25,但a的值會改變?yōu)?
3 W" ?) n: c+ b2. 指針的指針 W: y6 M' p# j; g$ q# c; A8 B% z
指向指針的指針可以用于實(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
+ T9 L$ u7 M8 C& \5 b& Q; a", *(*(pptr + 1) + 1)); // 輸出4# A8 {0 z. u' [8 b4 }' T
3. 函數(shù)指針數(shù)組) w$ g+ {& R! j0 q5 t4 `
數(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
2 }; @* o: p1 e, c5 b4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)
$ J+ B" l6 O# T: w ]7 i% T使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。struct Point { int x, y;};
8 x+ g6 r6 s* t& mvoid print_point(struct Point p) { printf("(%d, %d)
6 T4 p3 E6 e. d- a0 w; y# i0 v", p.x, p.y);}4 `3 U; z/ f' m6 i9 c8 j2 G
struct Point p = {1, 2};print_point(p);* \+ G8 d9 H& _ a5 p
5. 靜態(tài)和動(dòng)態(tài)內(nèi)存分配3 m. J! c6 N9 y
使用 “malloc” 和 “free” 可以動(dòng)態(tài)地分配和釋放內(nèi)存。int *p = malloc(sizeof(int) * 10);& Q% S* p1 O% r: H- M) |) u R
if (p) { for (int i = 0; i 10; i++) { p = i * i; } free(p);}9 d( _% q/ A5 b( }9 |& k1 P( n
6. 復(fù)雜的遞歸
( Z: V% Z" R t9 G7 j1 j" U3 q遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。int factorial(int n){ if (n 1) return 1; return n * factorial(n - 1);}
0 r) t8 \& C( R4 ]; I5 q1 s: B* X7. 位操作
( A, [/ i- R: K$ L0 ^位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測試位的狀態(tài)。int flags = 0x03; // 00000011flags |= 0x04; // 00000101flags &= 0x01; // 00000001flags ^= 0x01; // 11111110
4 Y7 n7 }. r$ m/ e: O E8. 復(fù)雜的條件編譯
: L M" v6 M6 @2 p' i; W" o預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。 #define DEBUG 1 int main() { #if DEBUG printf("Debug mode is on.
% X. b; }# G7 g% [$ d3 f"); #endif #ifdef DEBUG // 調(diào)試代碼 #endif return 0; }4 c7 J( ?5 U8 p8 @
9. 復(fù)雜的類型轉(zhuǎn)換
- v# {& Z: l- \& {/ a強(qiáng)制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問題。double d = 3.14159;int *p = (int *)&d;printf("%d
1 j+ q. u9 p( E' M", *p); // 輸出整數(shù)部分,可能不安全
1 l# h! T& \ `7 M10. 使用"__attribute__"擴(kuò)展, L" {9 j& A! s8 Z H
"__attribute__"是GCC編譯器提供的擴(kuò)展,可以用來控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。void __attribute__((noreturn)) fatal_error(const char *msg) { fprintf(stderr, "Fatal error: %s
8 r( G$ b- P7 h$ h7 e" U( H", msg); exit(EXIT_FAILURE);}
7 _8 C' S" r/ y- q' |這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時(shí),應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。
. O: [5 I4 k/ b! w6 j+ J8 p3 ?-END-8 `! J8 D% z. _: e0 \: `
往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀; G; I4 r0 f4 `" a; @
/ t5 D9 j5 T, d/ g; q
3 U7 p" ?% A) n' a3 ^ + m/ X1 W8 `3 A! @* f# [* F: T
( I1 o& |8 G9 S8 l
+ q" r6 e' m. [; m# l* I
jew1jl0ebjs6406074600.jpg (115.65 KB, 下載次數(shù): 0)
下載附件
保存到相冊
jew1jl0ebjs6406074600.jpg
2024-9-16 11:14 上傳
& \* l3 |7 p8 p5 }7 @! D
2 b) P! S$ f4 q: I8 n) ~5 g 被 char 類型的變量坑慘了!/ n. B6 F* L5 P
- u) R* l) J+ C q . i5 y4 J3 f8 Q
; P$ {8 Y( M+ X4 N- _9 W
) L1 p1 |! S2 y; v
s11ntp1hayu6406074700.jpg (80.73 KB, 下載次數(shù): 0)
下載附件
保存到相冊
s11ntp1hayu6406074700.jpg
2024-9-16 11:14 上傳
* S1 B, j* {2 I& B& h* i
4 O" m' P# f5 y$ ]4 Z1 S 嵌入式 C 語言知識點(diǎn),動(dòng)態(tài)變長數(shù)組
. `/ ]# {3 l6 ?' A
- g9 `3 w% `) u/ z 7 A4 E. H- }0 N' g
. L; W" g, J3 } g0 X# M4 U
% d- w- n" x9 B5 x/ y+ d* z
qwj1lqkzgvf6406074800.jpg (114.88 KB, 下載次數(shù): 0)
下載附件
保存到相冊
qwj1lqkzgvf6406074800.jpg
2024-9-16 11:14 上傳
5 c" `3 \6 o5 R* _" I2 ^ , a+ r6 O2 x/ l' o8 |1 J
嵌入式 C 語言技巧,不完全類型
6 h: ^4 K4 @% o/ n# t8 r7 ~6 v我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
( T% V4 g8 P* V$ ]6 \ ~& ], c" @關(guān)注我,一起變得更加優(yōu)秀! |
|