為嵌入式系統開發軟件需要時間——通常比最初預期的要多。
造成這種情況的一個原因是,雖然初始編碼可能進展迅速,但調試周期似乎是無休止的。以后,代碼的維護是不可避免的,而且需要比預期更多的時間。這是因為在嘗試修改之前準確理解代碼的功能會產生開銷。
這一觀察的結果是,應高度重視代碼的可讀性。易于閱讀的代碼不太可能出現錯誤,因此減少了調試時間。如果代碼易于理解,則更易于維護。因此,請始終牢記人類讀者——畢竟,它可能是你。(我聽說它建議你假設你的代碼未來的維護者是一個知道你家庭地址的精神病患者。)
代碼由兩部分組成:編譯器需要看到的東西(C 語句和聲明)和需要對編譯器隱藏的文本(主要是供人類讀者使用的)。隱藏的東西主要是:
文檔——代碼中的注釋
暫時刪除的代碼——調試過程中不可避免的一部分
調試/跟蹤代碼——可以根據需要打開和關閉
有趣的是,如果您取出純粹為人類讀者閱讀的內容(其中還包括使用有意義的標識符和額外的空格,如換行符),結果是完全不可讀的代碼。一些軟件公司利用這一點來分發源代碼,同時保護他們的知識產權。
我將看看我們對編譯器隱藏的東西。
文檔
每個人都知道評論是個好主意,但我們都很懶惰。然而,這種努力是值得的。舊式/* 。.. */ C注釋還可以,但我覺得 C++ 行尾[ //。.. ]的變化更清晰。它們仍然需要小心使用。例如,像這樣的代碼:
并且不要使用標簽。它們不是便攜式的。
臨時代碼刪除
在調試和測試代碼的過程中,能夠暫時“關閉”一段代碼通常很有用。許多程序員通過將/*放在開頭,將*/放在結尾來“注釋掉”代碼以實現此結果。這是快速而骯臟的,但經常無法達到所需的結果。許多編譯器不支持嵌套注釋,因此,如果代碼已經被注釋,就會出現問題。總的來說,它容易出錯,應該避免。
使用 C++ 風格的//注釋符號——即,將//放在每行的開頭——稍微好一點,但應用起來非常乏味,而且在刪除時也可能容易出錯。
實現此結果的最佳方法是使用預處理器指令,因此:
在任何情況下,“關閉”的代碼序列都不應包含在任何正在考慮發布的代碼中。
調試/跟蹤代碼
另一種臨時代碼是為了便于在調試時輸出或記錄額外信息而包含的。盡管現代調試器和此類工具可能非常有效,但有時檢測代碼仍然是弄清楚到底發生了什么的最佳方式?,F代開發工具是如此之快,以至于重建以創建啟用調試的映像并不是一個嚴重的開銷。
促進這一點的常用方法是使用預處理器指令,因此:
因此,當定義符號DEBUG_TRACE時,將包含調試代碼。
一個稍微不同的方法是這樣編碼:
這個雙重否定看起來很笨拙,但是這個符號用于控制標準的assert()宏。程序員需要定義符號來抑制調試模式。我感謝 Michael Barr,他在嵌入式 C 編碼標準中提高了我對這種方法的認識。
審核編輯:郭婷
-
嵌入式
+關注
關注
5089文章
19169瀏覽量
306760 -
C++
+關注
關注
22文章
2114瀏覽量
73773 -
編譯器
+關注
關注
1文章
1640瀏覽量
49223
發布評論請先 登錄
相關推薦
評論