C 標頭檔案的包含順序

2021-06-18 17:12:15 字數 1538 閱讀 3938

一.《

google c++ 

程式設計風格指南》裡的觀點

dir2/foo2.h (preferred location — see details below).

c system files.

c++ system files.

other libraries' .h files.

your project's .h files.

我們看到的是這裡《google c++ 程式設計風格指南》倡導的原則背後隱藏的目的是:

1. 為了減少隱藏依賴,同時標頭檔案和其實現檔案匹配,應該先包含其首選項(即其對應的標頭檔案)。

2. 除了首選項外,遵循的是從一般到特殊的原則。不過我覺得《google c++ 程式設計風格指南》的順序:c標準庫、c++標準庫、其它庫的標頭檔案、你自己工程的標頭檔案中漏了最前面的一項:作業系統級別的標頭檔案,比如上面的例子sys/types.h估計不能歸入c標準庫,而是linux作業系統提供的sdk吧。因此我覺得更準確的說法應該是:os sdk .h , c標準庫、c++標準庫、其它庫的標頭檔案、你自己工程的標頭檔案。

3.之所以要將標頭檔案所在的工程目錄列出,作用應該是命名空間是一樣的,就是為了區分不小心造成的檔案重名。

二.《

c++程式設計思想》中的不同觀點

假設某個cpp如下:

#include

#include "myclass.h"

編譯器的分析過程

先分析,這個沒有錯誤,ok繼續分析

分析"myclass.h",發現編譯錯誤,終止分析並報錯。

如果我們把上述順序調換,變為:

#include "myclass.h"

#include

那麼編譯器先分析"myclass.h",發現編譯錯誤,終止分析並報錯。

明顯可以看出第二種方式能夠令分析速度加快。

把最容易出錯的標頭檔案(也就是最特殊的標頭檔案)首先#include,這有點像短路求值(if ( 0 && 1 )),一旦出錯,後面就不必再分析。

當然如果所有檔案都沒有錯誤,那麼兩種方式的分析速度會一樣快。

綜合來看,我們應該以這樣的方式來#include標頭檔案:

從最特殊到最一般,也就是,

#include "本類標頭檔案"

#include "本目錄標頭檔案"

#include "自己寫的工具標頭檔案"

#include "第三方標頭檔案"

#include "平台相關標頭檔案"

#include "c++庫標頭檔案"

#include "c庫標頭檔案"

預編譯標頭檔案:防止同一組標頭檔案在多個cpp檔案中被重複分析。

標頭檔案守衛:防止同一標頭檔案在單個cpp檔案中被重複分析。

標頭檔案包含順序有最特殊到最一般:使用短路編譯以加快編譯出錯的過程。

參考:《c++程式設計思想第二版》p432

參考文獻:

C 標頭檔案包含順序

使用標準的標頭檔案包含順序可增強可讀性,避免隱藏依賴。h c 系統檔案 c 系統檔案 其他庫的 h 檔案 本專案內 h 檔案 h 本專案內 h 檔案 其他庫的 h 檔案 c 系統檔案 c 系統檔案 為了減少隱藏依賴,同時標頭檔案和其實現檔案匹配,應該先包含其首選項 即其對應的標頭檔案 google風...

C 標頭檔案包含

c 編譯是一件非常費時的事情,為了盡量的減少編譯時間,必須更好的包含標頭檔案。下面有幾條很重要的教條,可以參考。1 在標頭檔案中能用類前置宣告代替標頭檔案包含的就用前置宣告。因為使用類前置宣告,當引用的類發生改變時,當前檔案不需要重新編譯。a 必須要包含標頭檔案的情況 a繼承c,a類的標頭檔案中必須...

標頭檔案包含順序以及設計原則

關於c的標頭檔案包含,我認為體現了軟體的模組設計以及包含關係,對於標頭檔案包含,我個人看法如下 1.乙個基礎標頭檔案提供常用的資料型別 修飾符以及基礎操作巨集。例如叫basicdef.h 2.標頭檔案盡量只包含 basicdef.h,依賴模組的標頭檔案,也未必需要加到頭檔案中。3.global.h作...