|
我是老溫,一名熱愛學習的嵌入式工程師# e ]7 W: I' w1 J0 M7 m: K
關注我,一起變得更加優(yōu)秀!
, ]6 C7 |7 g2 A" l" d" W& A2 [( P在嵌入式軟件開發(fā)領域,C 語言是一種功能強大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。( Y; ^" U- R9 ]" S% o
以下是一些可能被認為花哨的C語言特性及其示例:7 F z' J- d% f4 P, D+ ?1 D; @
1. 宏定義的高級用法6 Z) |7 S: n: ]/ Z1 m2 w2 ^
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。#define SQUARE(x) ((x) * (x))int a = 5;printf("%d
5 Z; X! k3 O7 w# E. m. r", SQUARE(a++)); // 輸出25,但a的值會改變?yōu)?6 }& e6 z. n( W% \, I P) t5 M
2. 指針的指針
( m7 X3 p1 n3 N5 Y& {. |5 U指向指針的指針可以用于實現(xiàn)復雜的數(shù)據(jù)結構,比如二維數(shù)組。int **pptr;int arr[2][2] = {{1, 2}, {3, 4}};pptr = &arr[0];printf("%d
8 H$ O" O0 Y1 E# Q! ?: [" L", *(*(pptr + 1) + 1)); // 輸出4/ `* K, a5 f9 e! j4 p4 U# d: N3 a
3. 函數(shù)指針數(shù)組
2 I3 z# K2 M; y+ `0 k( S數(shù)組中的每個元素都是指向函數(shù)的指針,這可以用于回調(diào)函數(shù)或實現(xiàn)簡單的函數(shù)映射。void (*func_array[])(int) = {func1, func2, func3};func_array[1](42); // 調(diào)用func2
, N: O6 p& {/ f3 U6 b: j4. 結構體和聯(lián)合體作為函數(shù)參數(shù)3 ?0 E: y* H# A
使用結構體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復雜的數(shù)據(jù)結構。struct Point { int x, y;};
* y( j) J# ]: Y6 X+ {void print_point(struct Point p) { printf("(%d, %d)# n- [; [+ N. p
", p.x, p.y);}
: \3 X5 K2 }; Tstruct Point p = {1, 2};print_point(p);2 H3 _3 k2 |3 t9 O) \
5. 靜態(tài)和動態(tài)內(nèi)存分配; d! r+ M1 [9 G; _1 o, g. c
使用 “malloc” 和 “free” 可以動態(tài)地分配和釋放內(nèi)存。int *p = malloc(sizeof(int) * 10); z# ~ t7 j: [$ F. ?1 C& g/ a* I4 [
if (p) { for (int i = 0; i 10; i++) { p = i * i; } free(p);}
' M m* t0 ^- Q; t6. 復雜的遞歸- ?& t6 f; x# l
遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。int factorial(int n){ if (n 1) return 1; return n * factorial(n - 1);}' l3 F, U3 w) l+ k3 W3 g/ i
7. 位操作( Q/ [4 w) [) m. |
位操作可以用于設置、清除、翻轉、測試位的狀態(tài)。int flags = 0x03; // 00000011flags |= 0x04; // 00000101flags &= 0x01; // 00000001flags ^= 0x01; // 11111110
" o7 M! o/ u; ~# U8. 復雜的條件編譯
( r) c( D# m3 `/ [! [, Q0 [預處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復雜的條件編譯。 #define DEBUG 1 int main() { #if DEBUG printf("Debug mode is on.
6 ^: _2 N- T6 ?( r& Z"); #endif #ifdef DEBUG // 調(diào)試代碼 #endif return 0; }$ y, Y0 b- {' l4 ]9 D
9. 復雜的類型轉換
5 Y3 s; | P M強制類型轉換可以用于將一種類型的數(shù)據(jù)轉換為另一種類型,但需要小心使用以避免問題。double d = 3.14159;int *p = (int *)&d;printf("%d, j" W( w/ R5 ^+ w5 M- f
", *p); // 輸出整數(shù)部分,可能不安全
5 |) m i! ^, Q- j2 e10. 使用"__attribute__"擴展, T7 Z/ U4 `8 K' P0 x9 R3 e) P
"__attribute__"是GCC編譯器提供的擴展,可以用來控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。void __attribute__((noreturn)) fatal_error(const char *msg) { fprintf(stderr, "Fatal error: %s2 ^; ^! n* l! {0 y
", msg); exit(EXIT_FAILURE);}
8 S1 X$ j4 U; f$ N q這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護。因此,在使用這些特性時,應該權衡其利弊,并確保代碼的清晰性和可讀性。
! s" q' @/ ^4 C/ q9 \& c" |6 j2 O-END-
/ T& m' ?0 z6 j1 L/ f0 p Q, ~* }往期推薦:點擊圖片即可跳轉閱讀
7 `4 l& }. S: M D4 o3 G1 r2 ]7 H# p) F" }0 E( F% ^, a
- |0 U& I j2 Z9 {) l4 v7 a 0 J$ R6 z& M+ \# W7 d) e
* x+ t3 w: Z/ w6 q( Z: t& } i
0 V* z/ b* g; h% e
0nz2leceguu6407353041.jpg (115.65 KB, 下載次數(shù): 0)
下載附件
保存到相冊
0nz2leceguu6407353041.jpg
2024-8-22 13:04 上傳
- y7 c8 w8 u% C: k1 ?
8 v1 l- {& \* p2 ?, I4 j 被 char 類型的變量坑慘了!
0 z) ?1 Z/ z. G w7 ~" d+ B$ {
& r1 ?; l" i! l* h. ` F
b* n1 Y! R' D% Q5 L( t. E
& N; a0 |+ f7 F3 ~" b; @
- N+ w/ c6 a3 N7 B# ^
godymjyzsqs6407353141.jpg (80.73 KB, 下載次數(shù): 0)
下載附件
保存到相冊
godymjyzsqs6407353141.jpg
2024-8-22 13:04 上傳
/ T0 ^! x8 u0 S6 g ~( b( s
; ?0 A5 G* w N1 c3 s 嵌入式 C 語言知識點,動態(tài)變長數(shù)組
7 z% b. q$ ]9 Y+ u % ^* U9 N0 b2 M3 D
% R( Q# C f1 B' Q" D9 u
' o' V$ b# p# F& D4 t * s( ~, U1 n$ U
uhjmkka5wjj6407353241.jpg (114.88 KB, 下載次數(shù): 0)
下載附件
保存到相冊
uhjmkka5wjj6407353241.jpg
2024-8-22 13:04 上傳
D; Q) d' n) v. O8 V/ r3 G
+ g3 s0 ]9 U8 |3 p- R7 { 嵌入式 C 語言技巧,不完全類型
2 W w0 O( H1 e. C我是老溫,一名熱愛學習的嵌入式工程師
( o" ~8 w; z; o* x, S. C0 J7 r9 s關注我,一起變得更加優(yōu)秀! |
|