g++ -H 打印頭文件包含順序和有效性
作者: dzqabc
博客: https://www.cnblogs.com/dongzhiquan/archive/2013/04/11/3013486.html
發佈: 2013-04-11 00:24
g++ -H 選項
有時爲定位一些如頭文件循環包含致編譯不過問題,我們要知道頭文件包含順序。
g++ -H 除了進行正常編譯,還會打印每個頭文件的名稱。每個文件通過縮進表示它在包括堆棧中的深度。無效的預編譯頭文件也會打印出來;無效的預編譯頭文件打印…x,有效的打印…!
參考&示例
vc++ 中相似的編譯選項
- 編譯器的輸出包含文件列表,嵌套的包含文件可以顯示包括文件中的包含文件
- 語法
/showIncludes
- 在 Visual Studio 開發環境中設置此編譯器選項
- 打開項目的“屬性頁” 對話框。
- 單擊 “C/C++” 文件夾。
- 單擊高級屬性頁。
- 修改顯示包含屬性。
gcc -E 生成預處理文件
作者: 心田居士
博客: https://www.cnblogs.com/liuzhenbo/p/11030852.html
RSS: http://c.biancheng.net/view/2375.html
發佈: 2019-06-16 10:58
-E 選項, 保留預處理器的輸出文件
C語言代碼在交給編譯器之前,會先由預處理器進行一些文本替換方面的操作,例如宏展開、文件包含、刪除部分代碼等。
在正常的情況下,GCC 不會保留預處理階段的輸出文件,也即.i文件。然而,可以利用-E選項保留預處理器的輸出文件,以用於診斷代碼。-E選項指示 GCC 在預處理完畢之後即可停止。
默認情況下,預處理器的輸出會被導入到標準輸出流(也就是顯示器),可以利用-o選項把它導入到某個輸出文件:
$ gcc -E circle.c -o circle.i # 表示把預處理的結果導出到 circle.i 文件。
-C 選項, 阻止預處理器刪除文件中的註釋
因爲頭文件可能相當大,如果源文件包括了多個頭文件,那麼它的預處理器輸出可能會龐雜難讀。使用-C選項會很有幫助,這個選項可以阻止預處理器刪除源文件和頭文件中的註釋:
$ gcc -E -C circle.c -o circle.c
注意,這裏是大寫的 -C,不是小寫的 -c。小寫的 -c 表示只編譯不鏈接。
GCC 預處理器階段常用的選項
-Dname[=definition]
在處理源文件之前,先定義宏 name。宏 name 必須是在源文件和頭文件中都沒有被定義過的。將該選項搭配源代碼中的#ifdef name命令使用,可以實現條件式編譯。如果沒有指定一個替換的值,該宏被定義爲值 1。
-Uname
如果在命令行或 GCC 默認設置中定義過宏 name,則“取消”name 的定義。-D和-U選項會依據在命令行中出現的先後順序進行處理。
-Idirectory[:directory[…]]
當通過 #include 命令把所需的頭文件包括進源代碼中時,除系統標準 include 目錄之外,指定其他的目錄對這些頭文件進行搜索。
-iquote directory[:directory[…]]
這是在最近 GCC 版本中新增的選項,它爲在 #include 命令中採用引號而非尖括號指定的頭文件指定搜索目錄。
-isystem directory[:directory[…]]
該選項在標準系統 include 目錄以外爲系統頭文件指定搜索目錄,且它指定的目錄優先於標準系統 include 目錄被搜索。在目錄說明開頭位置的等號,被視作系統根目錄的佔位符,可以使用–sysroot或-isysroot選項來修改它。
-isysroot directory
該選項指定搜索頭文件時的系統根目錄。例如,如果編譯器通常在 /usr/include 目錄及其子目錄下搜索系統頭文件,則該選項將引導到 directory/usr/include 及其子目錄下進行搜索。
–sysroot選項,採用一個連字符替代 i,它爲鏈接庫搜索而不是頭文件搜索指定系統根目錄以外的目錄。如果 isysroot 不可用,則 sysroot 既爲頭文件又爲鏈接庫搜索指定目錄。
-I- 選項
在較新版本的 GCC 中,該選項被-iquote替代。在舊版本中,該選項用於將命令行的所有-Idirectory選項分割爲兩組。所有在-I-左邊加上-I選項的目錄,被視爲等同於採用-iquote選項;這指的是,它們只對 #include 命令中採用引號的頭文件名進行搜索。
所有在-I-右邊加上-I選項的目錄,將對所有 #include 命令中的頭文件名進行搜索,無論文件名是在引號還是尖括號中。
而且,如果命令行中出現了-I-,那麼包括源文件本身的目錄不再自動作爲搜索頭文件的目錄。
對於include目錄而言,通常的搜索順序是:
- 包含指定源文件的目錄(對於在 #include 命令中以引號包括的文件名)。
- 採用-iquote選項指定的目錄,依照出現在命令行中的順序進行搜索。只對 #include 命令中採用引號的頭文件名進行搜索。
- 採用-I選型指定的目錄,依照出現在命令行中的順序進行搜索。
- 採用環境變量 CPATH 指定的目錄。
- 採用-isystem選項指定的目錄,依照出現在命令行中的順序進行搜索。
- 採用環境變量 C_INCLUDE_PATH 指定的目錄。
- 系統默認的 include 目錄。
更多示例
- 使用gcc的-E -P選項展開源代碼中的宏
gcc -E -P -< header2.h > shit.h header2.h中的宏展開之後,生成shit.h文件 -P選項能夠屏蔽掉垃圾內容