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

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

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

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

[復(fù)制鏈接]

462

主題

462

帖子

1055

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1055
跳轉(zhuǎn)到指定樓層
樓主
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師, w9 z$ p1 C  l  K8 {7 ?
關(guān)注我,一起變得更加優(yōu)秀!6 D2 T& e% J. A" t5 _
從事嵌入式軟件開發(fā)的工程師朋友都知道,C 語言是一種非常靈活和強(qiáng)大的編程語言,尤其是在操作系統(tǒng)內(nèi)核方面,C 語言更有著舉足輕重的地位。3 B7 n0 G0 S. R# a# @; r
但是,隨著 C 語言編程實(shí)踐的發(fā)展和編程語言的演進(jìn),以往經(jīng)常使用的一些 C 語言語法特性,逐漸開始被行業(yè)認(rèn)為,不推薦使用。
6 g2 f9 Z. q' E, L. B: Y& X主要因?yàn),使用這些語法特性可能會(huì)導(dǎo)致代碼可讀性差、可維護(hù)性低、安全性問題或者效率低下。
9 s8 a) W; V6 Q; h
1 P' K0 C: R* S* l7 s$ P) y' t以下是一些不建議使用的 C 語言語法特性:: E- u& j6 V: U& T* N( b- s1 D
1. 魔法數(shù)字(Magic Numbers)
! X! K& D5 V5 i/ q- @9 ^直接在代碼中使用具體的數(shù)值,如 if (x == 5) ,而不是定義為常量或枚舉類型。這樣做會(huì)導(dǎo)致該段代碼語義含糊,維護(hù)該代碼的程序員極有可能不知道該數(shù)字所表達(dá)的含義。
; }/ i2 h# O$ f7 P' F! ~2. 全局變量* h  R, G% ^5 {; E5 Y% C6 H
過度使用全局變量可能導(dǎo)致代碼難以理解和維護(hù),因?yàn)樗鼈兛梢栽诔绦虻娜魏蔚胤奖恍薷,并且讓各個(gè)模塊存在高度的耦合,C 語言軟件規(guī)模越大,越不建議使用全局變量。  U- e) v- ?( I1 S
嵌入式 C 語言,為什么全局變量越少越好?9 R8 A) h, a! o, h' K6 j
3. 宏(Macros)/ l. ^6 u% A3 S+ R1 T& W+ g# A, D
宏其實(shí)很有用,可以幫助程序員借助編譯器的運(yùn)算能力,在預(yù)處理階段處理一些內(nèi)容,但過量地使用宏定義,可能會(huì)導(dǎo)致代碼閱讀性變差,并且可能導(dǎo)致代碼難以調(diào)試和容易出錯(cuò),尤其是在宏展開時(shí)。( c% E" t& d+ ?& {9 J
4. 指針運(yùn)算
1 [$ E/ y. s8 \9 R& J/ O: t8 b直接操作指針進(jìn)行算術(shù)運(yùn)算,如 p++ ,效率有時(shí)是比較高的,但一定一定要注意在進(jìn)行指針運(yùn)算時(shí),指針的運(yùn)算范圍限定,一不小心使用不當(dāng),極有可能會(huì)造成內(nèi)存訪問錯(cuò)誤。
, Z. }. K- D) e( l1 P5. goto語句7 ~. b  A9 V8 D6 X: w
goto 語句可以跳轉(zhuǎn)到程序的任意位置,這個(gè)跳轉(zhuǎn)可以任意操作并且會(huì)忽略一大段邏輯結(jié)構(gòu)代碼,雖然很多錯(cuò)誤處理都使用goto,但在業(yè)務(wù)邏輯設(shè)計(jì)時(shí)建議慎用,這會(huì)很容易破壞代碼的結(jié)構(gòu)化,使得代碼難以閱讀和維護(hù)。
# `* H8 x$ g! P9 V' p7 ~. q6. 未使用的代碼! y7 k: @9 |. O: c# {
代碼中如果存在大量未使用的變量和函數(shù),這可能會(huì)導(dǎo)致混淆和不必要的編譯警告,并且會(huì)讓后期的代碼維護(hù)變得復(fù)雜和困難,建議代碼提交的時(shí)候,把不必要的代碼進(jìn)行注釋屏蔽或者直接刪除。
6 L% e. I2 ~, g, i0 A8 j7. C語言中的布爾類型濫用+ w/ R0 U! T! T" d
很多 C 語言程序員喜歡用整型值 0 和 1 用作布爾值,用數(shù)字 0 表示 false,用數(shù)字 1 表示 true,而不是使用 _Bool 類型,這在以前舊的 C 語言語法里面很常見,但建議還是使用 bool 關(guān)鍵字進(jìn)行變量定義。
+ \2 [# {% K2 J5 J( f9 r, T8. 不安全的字符串操作
. M$ v6 |& ^3 l- L/ B使用 strcpy 或 strcat 等不安全的字符串函數(shù),這樣可能會(huì)導(dǎo)致緩沖區(qū)溢出,因?yàn)檫@類字符串操作函數(shù)不會(huì)檢查緩沖區(qū)的大小,它們會(huì)直接操作到字符串的 ‘\0’ 直至結(jié)束。7 p4 l* C/ D5 S* x
9. 不檢查函數(shù)返回值& V1 @# ?- o8 Y3 W* y2 o
對(duì)于返回錯(cuò)誤信息的函數(shù),不檢查其返回值可能導(dǎo)致程序在遇到錯(cuò)誤時(shí)繼續(xù)執(zhí)行。我們有時(shí)候?yàn)榱耸∈潞头奖悖瑫?huì)有意無意地忽略函數(shù)或模塊的返回值,但有時(shí)候,返回值包含了豐富的函數(shù)執(zhí)行信息。
0 ~3 ]0 ~+ |' `! q( D, V" P10. 不使用const關(guān)鍵字
/ T/ c4 j  O' H  Z2 y) N對(duì)于不應(yīng)該被修改的變量不使用 const 關(guān)鍵字,這可能導(dǎo)致意外修改和難以發(fā)現(xiàn)的錯(cuò)誤。在變量傳參或初始化定義時(shí),對(duì)于一些不再被修改的變量,建議使用 const 關(guān)鍵字,告訴程序員和編譯器,該變量在使用時(shí)不會(huì)再被修改。
5 \$ n/ u7 ^" o* ?2 O2 U) d這些只是一些簡(jiǎn)單的舉例,但并不是絕對(duì)禁止使用。實(shí)際上,是否使用某些語法還應(yīng)該取決于具體的編程環(huán)境和業(yè)務(wù)需求。% ]1 ]' p) S) e$ T" n  a  b- n& x3 t
有些規(guī)范在當(dāng)時(shí)可能是最佳的解決方案,但隨著業(yè)務(wù)和技術(shù)的發(fā)展,更好的替代方案也可能隨之出現(xiàn).0 R$ L8 `4 \' [3 g/ o  Z" \
在實(shí)際編程中,應(yīng)該盡量遵循最佳的編程實(shí)踐和代碼規(guī)范,以提高代碼的質(zhì)量和可維護(hù)性。# J. T, P( h+ M# \( f- P3 u
-END-
8 ?1 m6 G3 j* N往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀
/ m; Y( }# ]( Q' `) C" H$ \( p' F/ ?                                                       
7 _- |# q9 c0 E. l3 N7 C0 {                                                                1 N& x0 K. }! G3 P& u/ W
                                                                        ' T' S3 T% b6 s* ^/ d
                                                                               
( v' N/ f0 ~4 d! s3 c
8 N& \' C+ a, [                                                                               
; v7 ?( w; _/ X" U                                                                                        看了嵌入式大佬的日常工作,真的,我大寫一個(gè)【服】字!
5 M/ i' Y* K$ v                                                        # H0 H% t5 ~! \$ k
                                                               
* b) T2 O; l; E% h2 M) e                                                                        / q+ C" Z( R! X: g7 u1 `# E
                                                                                - B/ P9 P" l0 y' V

  @7 T: a1 @, f6 @7 V0 |9 c  m5 }                                                                                9 x  [2 N& D3 W! q6 [- m
                                                                                        嗶!你寫的嵌入式 C 語言代碼,短路啦!
& I+ `: F. [+ q& b9 T# w+ H+ a                                                                  C5 [8 h, ]% Y+ k
                                                                        + r# K, O; J2 i8 G
                                                                                  X( V* [# @0 x, ]. }( Q( @

, t- K6 j7 F5 m- D                                                                                2 ?4 y+ q7 m( }- ^7 I
                                                                                        嵌入式軟件,寫代碼之前,真的不需要進(jìn)行軟件架構(gòu)設(shè)計(jì)嗎?
8 e4 O; A$ m% m4 j' A                                                                               
" g' q; X: t3 R* }                                                                       
, b5 d5 _/ D" X# l+ ]8 e                                                                ; b  B0 r: N% H, E5 g
                                                        我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師) G5 f% O" T5 S  p5 J
關(guān)注我,一起變得更加優(yōu)秀!# t9 V4 q9 I% r  T7 o& d

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

本版積分規(guī)則


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