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

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

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

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

[復(fù)制鏈接]

462

主題

462

帖子

1055

積分

三級會(huì)員

Rank: 3Rank: 3

積分
1055
跳轉(zhuǎn)到指定樓層
樓主
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
. f5 [2 d# k, N7 W$ ~$ q" }關(guān)注我,一起變得更加優(yōu)秀!( A, W7 o; [8 r
從事嵌入式軟件開發(fā)的工程師朋友都知道,C 語言是一種非常靈活和強(qiáng)大的編程語言,尤其是在操作系統(tǒng)內(nèi)核方面,C 語言更有著舉足輕重的地位。' y& F1 f3 c$ m- E( _: q+ I
但是,隨著 C 語言編程實(shí)踐的發(fā)展和編程語言的演進(jìn),以往經(jīng)常使用的一些 C 語言語法特性,逐漸開始被行業(yè)認(rèn)為,不推薦使用。% T1 f! n7 k  y9 H2 V
主要因?yàn),使用這些語法特性可能會(huì)導(dǎo)致代碼可讀性差、可維護(hù)性低、安全性問題或者效率低下。/ e+ w2 d; I" m, u
7 R! E+ ^5 D- K9 y, K  [& Y
以下是一些不建議使用的 C 語言語法特性:* D) O" U) N  ?+ o. M1 a
1. 魔法數(shù)字(Magic Numbers)( q  y! t4 k* T+ ?" o* W
直接在代碼中使用具體的數(shù)值,如 if (x == 5) ,而不是定義為常量或枚舉類型。這樣做會(huì)導(dǎo)致該段代碼語義含糊,維護(hù)該代碼的程序員極有可能不知道該數(shù)字所表達(dá)的含義。
0 Y" r. Q/ K! I0 V7 s2. 全局變量) \$ B* _6 V/ [/ p7 u
過度使用全局變量可能導(dǎo)致代碼難以理解和維護(hù),因?yàn)樗鼈兛梢栽诔绦虻娜魏蔚胤奖恍薷,并且讓各個(gè)模塊存在高度的耦合,C 語言軟件規(guī)模越大,越不建議使用全局變量。
; M3 l8 g) Q( S- A. `嵌入式 C 語言,為什么全局變量越少越好?
& o- ^2 t( L; Y0 o/ x, z+ @- Z! Z3. 宏(Macros)
) h& E; P! s+ E0 W6 f" ]宏其實(shí)很有用,可以幫助程序員借助編譯器的運(yùn)算能力,在預(yù)處理階段處理一些內(nèi)容,但過量地使用宏定義,可能會(huì)導(dǎo)致代碼閱讀性變差,并且可能導(dǎo)致代碼難以調(diào)試和容易出錯(cuò),尤其是在宏展開時(shí)。
3 \# N& ^4 C; t1 `( X1 d+ {4. 指針運(yùn)算
8 q; h. G5 E$ V8 k, N直接操作指針進(jìn)行算術(shù)運(yùn)算,如 p++ ,效率有時(shí)是比較高的,但一定一定要注意在進(jìn)行指針運(yùn)算時(shí),指針的運(yùn)算范圍限定,一不小心使用不當(dāng),極有可能會(huì)造成內(nèi)存訪問錯(cuò)誤。
4 k. Y  a  y9 ?4 x$ i5. goto語句
" w1 Q; g6 H+ s6 c8 Q( X7 b3 wgoto 語句可以跳轉(zhuǎn)到程序的任意位置,這個(gè)跳轉(zhuǎn)可以任意操作并且會(huì)忽略一大段邏輯結(jié)構(gòu)代碼,雖然很多錯(cuò)誤處理都使用goto,但在業(yè)務(wù)邏輯設(shè)計(jì)時(shí)建議慎用,這會(huì)很容易破壞代碼的結(jié)構(gòu)化,使得代碼難以閱讀和維護(hù)。6 d' Z3 h, f& s- }, _2 u, R
6. 未使用的代碼' ~3 K* F& @/ @% @( x% ?
代碼中如果存在大量未使用的變量和函數(shù),這可能會(huì)導(dǎo)致混淆和不必要的編譯警告,并且會(huì)讓后期的代碼維護(hù)變得復(fù)雜和困難,建議代碼提交的時(shí)候,把不必要的代碼進(jìn)行注釋屏蔽或者直接刪除。6 u! O0 \! g! i6 T6 ]3 c1 A0 |4 N
7. C語言中的布爾類型濫用
. R5 j. F. S# [  m, b- D3 W很多 C 語言程序員喜歡用整型值 0 和 1 用作布爾值,用數(shù)字 0 表示 false,用數(shù)字 1 表示 true,而不是使用 _Bool 類型,這在以前舊的 C 語言語法里面很常見,但建議還是使用 bool 關(guān)鍵字進(jìn)行變量定義。
6 W- ?+ g: z/ t  o8. 不安全的字符串操作, f& D2 R; [3 ?
使用 strcpy 或 strcat 等不安全的字符串函數(shù),這樣可能會(huì)導(dǎo)致緩沖區(qū)溢出,因?yàn)檫@類字符串操作函數(shù)不會(huì)檢查緩沖區(qū)的大小,它們會(huì)直接操作到字符串的 ‘\0’ 直至結(jié)束。
& g0 t' U+ r6 r- Z2 n9. 不檢查函數(shù)返回值
! Q) F: |" }1 W  U$ N1 z% C對于返回錯(cuò)誤信息的函數(shù),不檢查其返回值可能導(dǎo)致程序在遇到錯(cuò)誤時(shí)繼續(xù)執(zhí)行。我們有時(shí)候?yàn)榱耸∈潞头奖,?huì)有意無意地忽略函數(shù)或模塊的返回值,但有時(shí)候,返回值包含了豐富的函數(shù)執(zhí)行信息。5 C% s! I5 n' K- c
10. 不使用const關(guān)鍵字5 L7 G& v$ e/ A! s
對于不應(yīng)該被修改的變量不使用 const 關(guān)鍵字,這可能導(dǎo)致意外修改和難以發(fā)現(xiàn)的錯(cuò)誤。在變量傳參或初始化定義時(shí),對于一些不再被修改的變量,建議使用 const 關(guān)鍵字,告訴程序員和編譯器,該變量在使用時(shí)不會(huì)再被修改。
9 v7 {. W. O. }這些只是一些簡單的舉例,但并不是絕對禁止使用。實(shí)際上,是否使用某些語法還應(yīng)該取決于具體的編程環(huán)境和業(yè)務(wù)需求。
& P) Q3 O+ g) B2 q1 ^6 X% q有些規(guī)范在當(dāng)時(shí)可能是最佳的解決方案,但隨著業(yè)務(wù)和技術(shù)的發(fā)展,更好的替代方案也可能隨之出現(xiàn).
' }6 ~: ]: [: v在實(shí)際編程中,應(yīng)該盡量遵循最佳的編程實(shí)踐和代碼規(guī)范,以提高代碼的質(zhì)量和可維護(hù)性。
, r7 X! Y" C5 j6 n" P: x6 q-END-
. }" _% q8 i$ g8 ~7 S0 c  m! o往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀, U$ B! l: G) K' }6 d) K. A: x# l
                                                        2 x4 r  [* o2 Q& z% @
                                                               
1 Z/ P" V9 k4 y5 j. J! q                                                                       
) h0 @/ U& _. h4 C- C  _                                                                               
. |8 @  c- h" |8 }9 l$ G3 x6 Q + D# B3 Q2 i- J( k
                                                                               
0 R7 m% m" r9 F6 ]% o                                                                                        看了嵌入式大佬的日常工作,真的,我大寫一個(gè)【服】字!
- z& Q1 V/ C  b1 x                                                        4 Y, k; V2 K. C: W3 b7 X
                                                                ' r- e4 w8 R. s0 r7 G! n5 |0 e5 a# C) z
                                                                       
+ V% s, n+ U. n+ r' Y. p6 t                                                                                - l1 y9 E/ W7 ~' o( u
4 W$ O3 Z; W# u0 J3 y' b4 C' @
                                                                               
0 P# b/ n: U8 W- E" V# U' P                                                                                        嗶!你寫的嵌入式 C 語言代碼,短路啦!0 Q' P3 v0 g8 X
                                                               
/ i4 O( G/ X8 ]( Y0 O& D( u                                                                       
9 {- |- o7 H, k% P+ a/ ]                                                                               
5 F! J* I( r7 T: j( U! L & J1 O  z4 }1 R3 T3 s8 x
                                                                                & p, L$ o- e6 o- G5 T& @% ^
                                                                                        嵌入式軟件,寫代碼之前,真的不需要進(jìn)行軟件架構(gòu)設(shè)計(jì)嗎?1 T. a/ `9 `; P; @+ |! d8 b6 x! g
                                                                                7 f( I3 f1 e. u( _- O/ c" [% o
                                                                        5 z  m& D% o  O& x( x
                                                                7 T# I# P: Q* `
                                                        我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
- ]2 Y8 P# L6 F# O, J關(guān)注我,一起變得更加優(yōu)秀!
& p( p* r7 w/ J" }. y4 r

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

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

本版積分規(guī)則


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