原始檔包含
來自 cppreference.com
在緊接指令的行處將另一個原始檔包含到當前原始檔中。
目錄 |
[編輯] 語法
#include < h-char-sequence > new-line |
(1) | ||||||||
#include " q-char-sequence " new-line |
(2) | ||||||||
#include pp-tokens new-line |
(3) | ||||||||
__has_include ( " q-char-sequence " ) __has_include ( < h-char-sequence > ) |
(4) | (自 C23 起) | |||||||
__has_include ( string-literal ) __has_include ( < h-pp-tokens > ) |
(5) | (自 C23 起) | |||||||
1) 搜尋由 h-char-sequence 唯一標識的標頭檔案,並將指令替換為標頭檔案的全部內容。
2) 搜尋由 q-char-sequence 標識的原始檔,並將指令替換為原始檔的全部內容。它可能會回退到 (1) 並將 q-char-sequence 視為標頭檔案識別符號。
3) 如果 (1) 和 (2) 都不匹配,pp-tokens 將進行宏替換。替換後的指令將再次嘗試與 (1) 或 (2) 匹配。
4) 檢查是否有可用的標頭檔案或原始檔可供包含。
5) 如果 (4) 不匹配,h-pp-tokens 將進行宏替換。替換後的指令將再次嘗試與 (4) 匹配。
new-line | - | 換行符 |
h-char-sequence | - | 一個或多個 h-char 序列,其中出現以下任何字元都會導致未定義行為
|
h-char | - | 源字元集 中的任何成員,除了換行符和 > |
q-char-sequence | - | 一個或多個 q-char 序列,其中出現以下任何字元都會導致未定義行為
|
q-char | - | 源字元集 中的任何成員,除了換行符和 " |
pp-tokens | - | 一個或多個預處理標記序列 |
string-literal | - | 字串字面量 |
h-pp-tokens | - | 一個或多個預處理標記序列,除了 > |
[編輯] 解釋
1) 以實現定義的方式搜尋由 h-char-sequence 標識的檔案。此語法的目的是搜尋受實現控制的檔案。典型的實現只搜尋標準包含目錄。標準 C 庫隱式包含在這些標準包含目錄中。標準包含目錄通常可以透過編譯器選項由使用者控制。
2) 以實現定義的方式搜尋由 q-char-sequence 標識的檔案。此語法的目的是搜尋不受實現控制的檔案。典型的實現首先搜尋當前檔案所在的目錄,並且只有在找不到檔案時,才像 (1) 那樣搜尋標準包含目錄。
3) 指令中
include
後的預處理標記像普通文字一樣處理(即,當前定義為宏名稱的每個識別符號都替換為其預處理標記的替換列表)。所有替換後產生的指令應與前兩種形式之一匹配。< 和 > 預處理標記對之間或一對 " 字元之間的預處理標記序列如何組合成單個頭檔名稱預處理標記是實現定義的。4) 搜尋由 h-char-sequence 或 q-char-sequence 標識的標頭檔案或原始檔,就像該預處理標記序列是語法 (3) 中的 pp-tokens 一樣,只是不再執行宏展開。如果此類指令不滿足 #include 指令的語法要求,則程式格式錯誤。如果原始檔搜尋成功,
__has_include
表示式求值為 1,如果搜尋失敗,則求值為 0。5) 僅當語法 (4) 不匹配時才考慮此形式,在這種情況下,預處理標記像普通文字一樣處理。
如果找不到檔案,則程式格式錯誤。
|
(自 C23 起) |
[編輯] 注意
對於語法 (1),典型的實現只搜尋標準包含目錄。標準 C 庫隱式包含在這些標準包含目錄中。標準包含目錄通常可以透過編譯器選項由使用者控制。
語法 (2) 的目的是搜尋不受實現控制的檔案。典型的實現首先搜尋當前檔案所在的目錄,然後回退到 (1)。
當一個檔案被包含時,它會經過翻譯階段 1-4 的處理,其中可能包括遞迴地展開巢狀的 #include
指令,直到實現定義的巢狀限制。為了避免重複包含同一個檔案以及當一個檔案(可能是傳遞地)包含自身時造成的無限遞迴,通常使用標頭檔案保護:整個標頭檔案被包裹在
#ifndef FOO_H_INCLUDED /* any name uniquely mapped to file name */ #define FOO_H_INCLUDED // contents of the file are here #endif
許多編譯器還實現了非標準的 pragma #pragma once,其效果類似:如果同一個檔案(檔案身份以作業系統特定的方式確定)已經被包含,則停用該檔案的處理。
__has_include
結果為 1 僅表示存在具有指定名稱的標頭檔案或原始檔。這並不意味著包含該標頭檔案或原始檔時不會導致錯誤或包含任何有用的內容。
[編輯] 示例
本節不完整 原因:無示例 |
[編輯] 參考
- C23 標準 (ISO/IEC 9899:2024)
- 6.4.7 標頭檔案名 (p: 69)
- 6.10.1 條件包含 (p: 165-169)
- 6.10.2 原始檔包含 (p: 169-170)
- C17 標準 (ISO/IEC 9899:2018)
- 6.10.2 原始檔包含 (p: 119-120)
- C11 標準 (ISO/IEC 9899:2011)
- 6.10.2 原始檔包含 (p: 164-166)
- C99 標準 (ISO/IEC 9899:1999)
- 6.10.2 原始檔包含 (p: 149-151)
- C89/C90 標準 (ISO/IEC 9899:1990)
- 3.8.2 原始檔包含
[編輯] 另見
C 標準庫標頭檔案列表 | |
C++ 文件 關於 原始檔包含
|