include引入標頭檔案規則
語法定義
C++中include
關鍵字用於引入其他標頭檔案。在程式處於預處理
階段時,會將目標引入的標頭檔案的內容新增該指令的位置。引入語法見如下2種方式:
// 語法1
#include <example_header1>
// 語法2
#include "example_header2"
- 語法1會搜尋由
example_header1
唯一識別的標頭,並將該指令替換為這個標頭的全部內容。在一系列由實現定義的地點中搜尋由example_header1
唯一識別的標頭,並將該指令替換為這個標頭的全部內容。由實現定義如何制指定這些地點和識別標頭。 - 語法2會搜尋由
example_header2
識別的原始檔,並將該指令替換為這個原始檔的全部內容。可能退回至方式1並將example_header2
視為標頭識別符號,將該指令替換為由example_header2
識別的原始檔的全部內容。所指名的原始檔透過由實現定義的方式進行搜尋。如果不支援這種搜尋或者搜尋失敗,該指令按語法1重新處理,將原指令中包含的序列(包括大於號,如果存在)作為語法1中所需的序列。
內容參考連結:
原始檔包含 - cppreference.com
GCC-11.4.0實現
以上兩種語法所使用的標頭檔案搜尋路徑由具體編譯器實現定義,目前C++專案開發主要使用GCC
作為主要編譯工具鏈。GCC
對於include
語法實現規則如下:
- 對於
#include <file>
語法:用於引入系統標頭檔案,它在系統目錄的標準列表中搜尋檔名檔案,可以在編譯時使用-I
選項將目錄前置到該列表中。對於Ubuntu系統而言,系統預設搜尋路徑為/usr/include
與/usr/local/include
。 - 對於
#include "file"
語法:用於自己專案的標頭檔案,它在當前檔案所在目錄搜尋檔名檔案,可以在編譯時使用-iquote
選項將自定義目錄新增至搜尋目錄;如果搜尋失敗,則會退化為include <file>
方式繼續搜尋。
#include
的引數,無論是用引號還是尖括號分隔,其行為都像字串常量,因為註釋無法識別,宏名稱也無法展開。因此,#include<x/*y>
指定包含名為x/*y
的系統標頭檔案。但,若反斜槓出現在檔案中,它們將被視為普通文字字元,而不是跳脫字元。不處理任何適用於C中字串常量的字元轉義序列。因此,#include "x\n \\y"
指定一個包含三個反斜槓的檔名(有些系統將“\”
解釋為路徑名分隔符。所有這些系統也以相同的方式解釋“/”
。僅使用“/”
最便於移植。)。如果檔名後面的行中有任何內容(註釋除外),則為錯誤。
內容參考連結:
Include Syntax (The C Preprocessor)