
關於這條Coding Rule,雖然Google與Facebook等軟體巨擘們沒有強制要自己的員工加上大括號;並且以我過往的工作經驗看來,同事們對這條規矩的回饋總有雜音,想必大家都很糾結。
這裡提供一些傾向於要加括號的有力資訊 (而不只是感覺上加了比較好) 給大家參考:
1. 注重安全性的MISRA C的規定:
- MISRA C:2004
- Rule 14.9,if 結構後面應是一個複合語句(即用大括號包含) ,else 後面必須是一個複合語句(即用大括號包含) 或者另一個if 語句。 (From http://i.mtime.com/5690410/blog/6998138/)
- MISRA C:2012
- 根據MISRA提供的比較表 (https://www.misra.org.uk/forum/download/file.php?id=629&sid=ef7e4fac471adbd29e7ea9a093e93a7c) ,這條規則在 2012年版(編號改成Rule 15.6) 仍然被保留為必要性(required)規則
- MISRA C:2016
- 可惜我還找不到相關資訊。
2. Apple goto fail事件的低級Bug
提出一個發生在2012年關於Apple公司的真實案例,應該更有臨場感,詳細請參考文章 (https://coolshell.cn/articles/11112.html) ,文章中思考的面向頗多,推薦一讀,這裡只節錄一小段:…如我們強制使用語句塊括號,那麼,這兩個goto fail都會在一個if的語句塊裡,而且也容易維護並且易讀。……還是分多行,加上大括號會好一些。……雖然寫起來有點囉嗦,但利人利己。
3. 很容易產生疑慮的案例
TAB或空白鍵縮排因為不容易顯示出差異,所以很容易被弄錯,下面這種案例其實並不罕見,若能多加了大括號就會少掉很多問題。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//what's difference between FunA() and FunB()? | |
void FunA(void) | |
{ | |
if (condition_one) | |
if (condition_two) | |
foo(); | |
else | |
bar(); | |
} | |
void FunB(void) | |
{ | |
if (condition_one) | |
if (condition_two) | |
foo(); | |
else | |
bar(); | |
} |