頭文件的包含順序問題?

關於C/C++的頭文件包含順序,Google style裡面推薦這樣的順序:

C 系統文件

C++系統文件

其他庫頭文件

本項目內頭文件

但是也看到一些開源庫的頭文件組織順序是相反的:

本項目內頭文件

其他庫頭文件

C++系統文件

C 系統文件

2種相反的風格分別有哪些優點?


不,google style不是那個順序,而是

  1. foo/bar.h.
  2. C 系統文件
  3. C++系統文件
  4. 其他庫頭文件
  5. 本項目內頭文件

也就是.cpp對應的頭文件放在第一位。這麼做可以防止在bar.h裡面少包含了必須的頭文件,其他.cpp要包含bar.h的時候不會瘋狂報錯。


第一種的優點:符合了從一般到特殊的順序,先打地基再蓋房子的思路比較容易理解。

第二種的優點:符合了從特殊到一般的順序,也算是一種順序啦。而且這種順序能夠暴露出你的庫的頭文件是不是包含了所有必需的頭文件,如果某個你的庫文件沒有包含它必需的系統文件的話,那麼這個順序就會導致編譯錯誤。為什麼要暴露這種問題呢?是因為希望「如果用戶只使用你的庫里提供的函數,那麼他只需包含你的庫頭文件即可,你的頭文件會自己去包含所需頭文件」,可以方便用戶,否則用戶怎麼會知道你的庫依賴啥文件呢?

理性的頭文件裡面都有include guard,也就是#ifndef #define #endif之類組成的語句來處理自己被重複include的情況,所以先後順序不重要。重要的是你的頭文件要記得包含自己所需的頭文件,否則用戶用起來還挺頭疼的。所以我個人覺得第二種更好一點,第一種只是勝在直觀易理解而已。


說實話,只要分類良好索引方便,討論好壞基本都是玄學=_=黑魔法除外

對內統一才是重點啊=_=


如果是在新項目,組織沒要求的話,自由選擇適用的風格;如果你是維護已有的項目,盡量統一為一種風格。


推薦閱讀:

config、option、setting這三者在程序世界裡是什麼區別?
哈爾濱理工大學軟體工程專業怎麼樣?
你作為一名程序員,是如何提高英語的?
父母非得讓學電力專業,可我很想學軟體工程,怎麼辦?
二本學校的軟體工程學生出來拼得過北大青鳥嗎?

TAG:編程 | 軟體工程 | C編程語言 | C | CC |