電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 113|回復(fù): 0
收起左側(cè)

有哪些不推薦使用的嵌入式 C 語言語法特性?

[復(fù)制鏈接]

485

主題

485

帖子

1623

積分

三級會員

Rank: 3Rank: 3

積分
1623
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-21 17:50:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師. e% j1 j1 L% M
關(guān)注我,一起變得更加優(yōu)秀!  o# L/ o2 I# Z, {  P
從事嵌入式軟件開發(fā)的工程師朋友都知道,C 語言是一種非常靈活和強大的編程語言,尤其是在操作系統(tǒng)內(nèi)核方面,C 語言更有著舉足輕重的地位。) u( M  v+ Y% g7 _6 [. L0 s. T$ H8 E" ?
但是,隨著 C 語言編程實踐的發(fā)展和編程語言的演進,以往經(jīng)常使用的一些 C 語言語法特性,逐漸開始被行業(yè)認為,不推薦使用。
0 v% T4 G! \. V- J( f* }主要因為,使用這些語法特性可能會導(dǎo)致代碼可讀性差、可維護性低、安全性問題或者效率低下。
- L% N. B# Z$ }2 v; p% @9 u
6 z$ V5 o! @8 G以下是一些不建議使用的 C 語言語法特性:
% L0 H1 [" H7 o9 s& y( k1. 魔法數(shù)字(Magic Numbers)
% g! x2 |" U; G8 s( X+ G7 r直接在代碼中使用具體的數(shù)值,如 if (x == 5) ,而不是定義為常量或枚舉類型。這樣做會導(dǎo)致該段代碼語義含糊,維護該代碼的程序員極有可能不知道該數(shù)字所表達的含義。) R( n. v6 }4 B+ y3 C! f
2. 全局變量
" {7 h9 U7 O/ Z2 B. R* B" W. L過度使用全局變量可能導(dǎo)致代碼難以理解和維護,因為它們可以在程序的任何地方被修改,并且讓各個模塊存在高度的耦合,C 語言軟件規(guī)模越大,越不建議使用全局變量。
8 D( p' h2 s* P0 C% j嵌入式 C 語言,為什么全局變量越少越好?# ?9 U6 ~' r" E
3. 宏(Macros)( x" V# [3 k! h9 A/ g9 P2 \, o4 B
宏其實很有用,可以幫助程序員借助編譯器的運算能力,在預(yù)處理階段處理一些內(nèi)容,但過量地使用宏定義,可能會導(dǎo)致代碼閱讀性變差,并且可能導(dǎo)致代碼難以調(diào)試和容易出錯,尤其是在宏展開時。
$ }. j9 q, m4 A4. 指針運算
- X" p/ v& l8 l/ d" i( M5 m直接操作指針進行算術(shù)運算,如 p++ ,效率有時是比較高的,但一定一定要注意在進行指針運算時,指針的運算范圍限定,一不小心使用不當(dāng),極有可能會造成內(nèi)存訪問錯誤。
2 {# I- n1 H. L1 K- Q5. goto語句8 Y7 |, Y! l3 w7 s/ u5 F4 H# A; t, u
goto 語句可以跳轉(zhuǎn)到程序的任意位置,這個跳轉(zhuǎn)可以任意操作并且會忽略一大段邏輯結(jié)構(gòu)代碼,雖然很多錯誤處理都使用goto,但在業(yè)務(wù)邏輯設(shè)計時建議慎用,這會很容易破壞代碼的結(jié)構(gòu)化,使得代碼難以閱讀和維護。7 c' H; u5 P) q+ N1 e
6. 未使用的代碼; Z- o; N9 }6 R7 g" P$ l
代碼中如果存在大量未使用的變量和函數(shù),這可能會導(dǎo)致混淆和不必要的編譯警告,并且會讓后期的代碼維護變得復(fù)雜和困難,建議代碼提交的時候,把不必要的代碼進行注釋屏蔽或者直接刪除。& z0 ], l( U0 g9 e* J! d& Z
7. C語言中的布爾類型濫用4 Z  {. N" g3 U" B
很多 C 語言程序員喜歡用整型值 0 和 1 用作布爾值,用數(shù)字 0 表示 false,用數(shù)字 1 表示 true,而不是使用 _Bool 類型,這在以前舊的 C 語言語法里面很常見,但建議還是使用 bool 關(guān)鍵字進行變量定義。
9 Q6 a9 \" M7 ~# |' a* H1 h" V8. 不安全的字符串操作
# R& X' w8 L' w: W4 s* A( z使用 strcpy 或 strcat 等不安全的字符串函數(shù),這樣可能會導(dǎo)致緩沖區(qū)溢出,因為這類字符串操作函數(shù)不會檢查緩沖區(qū)的大小,它們會直接操作到字符串的 ‘\0’ 直至結(jié)束。' n8 C5 Z& W  K) \0 d7 X1 E8 i
9. 不檢查函數(shù)返回值
* _" `1 P% T, `- W1 z對于返回錯誤信息的函數(shù),不檢查其返回值可能導(dǎo)致程序在遇到錯誤時繼續(xù)執(zhí)行。我們有時候為了省事和方便,會有意無意地忽略函數(shù)或模塊的返回值,但有時候,返回值包含了豐富的函數(shù)執(zhí)行信息。& Y; _/ S% G& T/ M. ^
10. 不使用const關(guān)鍵字3 w% k6 e2 f0 A- }
對于不應(yīng)該被修改的變量不使用 const 關(guān)鍵字,這可能導(dǎo)致意外修改和難以發(fā)現(xiàn)的錯誤。在變量傳參或初始化定義時,對于一些不再被修改的變量,建議使用 const 關(guān)鍵字,告訴程序員和編譯器,該變量在使用時不會再被修改。) V2 D! Q0 c# |& t8 P/ a
這些只是一些簡單的舉例,但并不是絕對禁止使用。實際上,是否使用某些語法還應(yīng)該取決于具體的編程環(huán)境和業(yè)務(wù)需求。
" H) W3 N8 U' }7 b5 Y  T有些規(guī)范在當(dāng)時可能是最佳的解決方案,但隨著業(yè)務(wù)和技術(shù)的發(fā)展,更好的替代方案也可能隨之出現(xiàn).+ A0 n# n6 O+ @
在實際編程中,應(yīng)該盡量遵循最佳的編程實踐和代碼規(guī)范,以提高代碼的質(zhì)量和可維護性。
/ G% i7 T# h5 Z4 A+ N. D$ c& a-END-! X( ]3 r; ~) |7 Y
往期推薦:點擊圖片即可跳轉(zhuǎn)閱讀, y) \+ a" u! K. `# q( m6 }
                                                        , r+ D9 M. b9 u& c% O
                                                               
2 Y; ]; P6 ]! _/ [                                                                       
" t+ {+ b/ C7 D, d0 i& |/ B/ J                                                                                ; h0 g; w% B3 N( c* s- O
* X$ b( g/ ~9 C4 `8 ]% p' ~
                                                                                / j* H1 ?' S' f* t' l8 J. o
                                                                                        看了嵌入式大佬的日常工作,真的,我大寫一個【服】字!+ j! X' c" o/ F  y% J% O
                                                       
$ N9 R2 ^5 `' |5 m' b                                                               
) v# S' s! z2 ~: u4 G; N) `                                                                       
$ `( P% P7 B4 n# B! w, B' l0 n2 Z                                                                                ! C  N. K5 w9 z( f" s- I
% {/ p! S) W+ K8 ?) }1 A
                                                                                ' u- k6 {! W2 }, ?, J1 W$ C+ x
                                                                                        嗶!你寫的嵌入式 C 語言代碼,短路啦!
: @0 W5 f" `! w5 h7 L& g8 l                                                               
, w: P9 ^: A7 H                                                                        ' ~% `& e2 O2 L) C9 z0 a
                                                                               
" l% V1 U/ B: s0 f 7 T3 \* g1 q) L/ P  N5 n% [
                                                                               
+ D! a- K0 L' ^1 n                                                                                        嵌入式軟件,寫代碼之前,真的不需要進行軟件架構(gòu)設(shè)計嗎?
, f2 g) k, e8 s+ s: |                                                                               
" \" o1 ?  I1 S' V/ Z2 G/ R                                                                        ) O. q" P& p" u1 }
                                                                8 m6 N1 F1 |# R* F9 P, ]! s
                                                        我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師# C3 g, A& u' v$ o2 {- G
關(guān)注我,一起變得更加優(yōu)秀!
; ?3 |( p6 p; e0 t
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表