|
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
$ [: f- _. y7 G5 W" ?關(guān)注我,一起變得更加優(yōu)秀!
z- D7 K: f* c+ G* ^- ~: g8 C8 W7 z在嵌入式軟件開發(fā)領(lǐng)域,C 語言是一種功能強(qiáng)大、靈活的編程語言,它提供了很多語法特性,有些語法可能看起來比較"花里胡哨",用得好可能利大于弊,用不好,可能就是自己給自己挖坑。- S# M% f- y9 r3 |
以下是一些可能被認(rèn)為花哨的C語言特性及其示例:
. w0 ^7 u! L% F* v7 i1. 宏定義的高級(jí)用法/ ~, O: Y- G1 ?
使用宏可以模擬函數(shù)的行為,但要注意宏的副作用和調(diào)試難度。#define SQUARE(x) ((x) * (x))int a = 5;printf("%d: w9 k0 u% }6 b( I
", SQUARE(a++)); // 輸出25,但a的值會(huì)改變?yōu)?
1 ^7 \) o6 x" `* k9 q+ x# U# I3 E2. 指針的指針, d% L$ t) B, e9 H4 x; 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. t) |/ [7 J- o! u
", *(*(pptr + 1) + 1)); // 輸出4& F8 j+ G' p( D
3. 函數(shù)指針數(shù)組
4 R" ?$ `! g, m' d) G) h' X數(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
0 s/ n1 n' K' c) |; X3 V( s4. 結(jié)構(gòu)體和聯(lián)合體作為函數(shù)參數(shù)
9 B3 A) F3 I& R& E/ ]4 `使用結(jié)構(gòu)體或聯(lián)合體作為函數(shù)參數(shù)可以傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。struct Point { int x, y;};
! |+ k7 N, L# @; J- P kvoid print_point(struct Point p) { printf("(%d, %d)3 `( a, L3 o) _; b
", p.x, p.y);}
; z6 n9 ?0 {0 `. K) V& Q" ustruct Point p = {1, 2};print_point(p);2 E" J* B" j! k
5. 靜態(tài)和動(dòng)態(tài)內(nèi)存分配
! s4 M" a& ^' [# W9 n* Y/ r使用 “malloc” 和 “free” 可以動(dòng)態(tài)地分配和釋放內(nèi)存。int *p = malloc(sizeof(int) * 10);
+ d3 W0 Y' g3 T- L }9 rif (p) { for (int i = 0; i 10; i++) { p = i * i; } free(p);}; a0 l8 x) |2 z& W5 ]
6. 復(fù)雜的遞歸
. U( Z$ H2 i' M# G! q# h: P遞歸函數(shù)可以用于解決分治問題,但需要小心處理避免棧溢出。int factorial(int n){ if (n 1) return 1; return n * factorial(n - 1);}
' e) D% s# L* U ]/ O* o1 {( e7. 位操作9 a, p4 D0 m9 Z9 t$ e; J
位操作可以用于設(shè)置、清除、翻轉(zhuǎn)、測試位的狀態(tài)。int flags = 0x03; // 00000011flags |= 0x04; // 00000101flags &= 0x01; // 00000001flags ^= 0x01; // 11111110( l9 K6 p l2 l; B
8. 復(fù)雜的條件編譯, ?- [( z" P5 P5 k. |
預(yù)處理器的"#if"、"#ifdef"、"#ifndef"、"#elif"、"#else"和"#endif"指令可以用于復(fù)雜的條件編譯。 #define DEBUG 1 int main() { #if DEBUG printf("Debug mode is on.
9 L+ [8 K$ a4 |$ w2 a) v& t/ P( `"); #endif #ifdef DEBUG // 調(diào)試代碼 #endif return 0; }) j7 [+ i. B2 i) J
9. 復(fù)雜的類型轉(zhuǎn)換
% q3 k3 z" w/ O強(qiáng)制類型轉(zhuǎn)換可以用于將一種類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,但需要小心使用以避免問題。double d = 3.14159;int *p = (int *)&d;printf("%d! t! q% f& o+ A. o& c
", *p); // 輸出整數(shù)部分,可能不安全0 `# D. X/ l" t" }% [: s
10. 使用"__attribute__"擴(kuò)展3 h# T% B4 f& P: `1 l6 ]- v
"__attribute__"是GCC編譯器提供的擴(kuò)展,可以用來控制函數(shù)的調(diào)用約定、內(nèi)聯(lián)等。void __attribute__((noreturn)) fatal_error(const char *msg) { fprintf(stderr, "Fatal error: %s& z9 i+ a* `0 W* M
", msg); exit(EXIT_FAILURE);}
$ q/ N5 X) N6 G: s/ V5 O1 V這些特性在某些情況下非常有用,但它們也可能使代碼難以理解和維護(hù)。因此,在使用這些特性時(shí),應(yīng)該權(quán)衡其利弊,并確保代碼的清晰性和可讀性。
, | `5 g+ k( F! W6 M ]# X/ E-END-
9 n! z& ~3 I2 @4 P往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀* L* l* B& z! q
" r) W; k# J& Y/ _/ T0 |+ j
. w/ `& v, `' Y3 e4 t
! \) U, J. l% I. q4 S2 v
$ v1 f+ _4 K7 B h( f! M* a
! O. R; ]4 i+ O$ z- Q
0nz2leceguu6407353041.jpg (115.65 KB, 下載次數(shù): 1)
下載附件
保存到相冊
0nz2leceguu6407353041.jpg
2024-8-22 13:04 上傳
' d# q0 V1 T% l- [
$ _3 _# h- _( n+ z9 B4 R 被 char 類型的變量坑慘了!9 z. y, _, ^9 |% r" y. {# D
7 [% y C3 T9 Y# V6 O! v
& F5 s( Q& D: W+ y, t9 ~
7 t! ~1 V3 _$ B$ k
8 I$ T0 A* v# j) l: ? g
godymjyzsqs6407353141.jpg (80.73 KB, 下載次數(shù): 0)
下載附件
保存到相冊
godymjyzsqs6407353141.jpg
2024-8-22 13:04 上傳
4 O! a: f) r. _/ O
- ]4 j& g$ q) C+ ?- J$ S
嵌入式 C 語言知識(shí)點(diǎn),動(dòng)態(tài)變長數(shù)組" g/ Q3 o* a$ \
7 x" I8 g7 y! D% W. f
) c- i; V0 _2 j& m6 N & |" N' e4 g I9 v3 C+ Y- y; @) S
3 b. ]0 l! f( P' k" Q2 ?5 z* m
uhjmkka5wjj6407353241.jpg (114.88 KB, 下載次數(shù): 0)
下載附件
保存到相冊
uhjmkka5wjj6407353241.jpg
2024-8-22 13:04 上傳
. {6 S+ H$ t% O4 ]/ P, {
* C$ A* f L J$ C
嵌入式 C 語言技巧,不完全類型
# Q. T6 R* m. v* w3 H; k我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師, _; r3 `! o" F X7 D
關(guān)注我,一起變得更加優(yōu)秀! |
|