C頭文件中尖括號與雙引號的區別及編譯搜索順序


這兩天被問到一個很有意思的問題:C頭文件中尖括號與雙引號有什么區別,以前只大約知道 <> 常用在系統庫文件,"" 常用在自定義的借口文件中,那具體在gcc編譯搜索過程中有啥區別,還得仔細查閱一番相關文檔。

針對 <>  與 "" 的區別有如下解釋:

摘抄自:https://gcc.gnu.org/onlinedocs/cpp/Include-Syntax.html#Include-Syntax

 

而在搜索時的區別,則做如下優先級排序:

摘抄自: https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html#Directory-Options

 

 

簡單理解就是:

1. 尖括號告訴編譯器去搜索標准系統目錄,可使用 -I 選項添加其它搜索目錄

2. 雙引號告訴編譯器先搜索以源文件路徑為參考的目錄,其次搜索引號目錄,最后搜索標准系統目錄, -iquote 選項可添加其它目錄到引號目錄列表中。

 

源文件路徑為參考的目錄

如何理解其含義呢,以實際情況為例,本地存在一個header/目錄,其內部目錄樹結構如下所示:

圖中的hello.c文件,是這樣包含頭文件的:#include "..inc/hello.h"

 

測試1. shell 處在 ~/header/src/ 目錄,跟蹤gcc 的編譯搜索過程: strace -f -o log gcc say_hello.c ,查看log輸出:

從圖中的搜索路徑可知:因源文件剛好處在gcc執行目錄下,因此在編譯時,源文件的相對執行目錄為 . , dot默認可省略,再拼接上#include "../inc/hello.h" 引號內的路徑,那么gcc會定位到 "../inc/say_hello.h" 去搜索hello.h文件

 

測試2. shell處在 ~/header/ 目錄,跟蹤gcc的編譯搜索過程:strace -f -o log gcc ../src/say_hello.c,查看log輸出:

從圖中搜索路徑可知:因源文件在gcc目錄的下一級目錄,因此在編譯時,源文件的相對執行目錄為  src/ , 再拼接上 #include "../inc/hello.h" 引號內的路徑,那么gcc會定位到 "src/../inc/say_hello.h" 去搜索hello.h文件.

 

所以從測試結果來看,gcc編譯時,以執行目錄為參考點來定位源文件的路徑,再以源文件為參考點來定位頭文件路徑。在上述測試中,~/header/src/say_hello.h 文件始終是被忽略的,除非代碼中寫成 #include "say_hello.h" 。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM