gcc, vc 編譯輸出頭文件包含順序

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 (https://docs.microsoft.com/zh-cn/cpp/build/reference/showincludes-list-include-files?view=vs-2019)

  • 編譯器的輸出包含文件列表,嵌套的包含文件可以顯示包括文件中的包含文件
  • 語法
    /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 目錄。

更多示例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章