前處理器
出自 cppreference.com
< cpp
預處理器會在轉譯階段 4,即編譯之前執行。預處理的結果是一個單一檔案,隨後會傳遞給實際的編譯器。
目錄 |
[編輯] 指令
預處理指令用於控制預處理器的行為。每個指令佔用一行,並具有以下格式:
- # 字元。
- 一連串的
- 一個標準定義的指令名稱(列於下方),後接對應的引數,或者
- 一個或多個預處理標記 (preprocessing tokens),其中起始標記不是標準定義的指令名稱,在此情況下,該指令屬於條件支援 (conditionally-supported),語意由實作定義(例如,一個常見的非標準擴充是指令 #warning,它會在編譯期間發出使用者定義的訊息)(C++23 前),或者
- 什麼都沒有,在此情況下該指令無效。
- 一個換行符。
|
模組與匯入指令 (module and import directives) 同樣屬於預處理指令。 |
(自 C++20 起) |
預處理指令不可來自巨集展開。
#define EMPTY EMPTY # include <file.h> // not a preprocessing directive
[編輯] 功能
預處理器具有以下原始碼檔案轉譯功能:
- 條件式編譯原始碼檔案的某些部分(由指令 #if、#ifdef、#ifndef、#else、#elif、#elifdef、#elifndef(C++23 起) 以及 #endif 控制)。
- 替換文字巨集,同時可能連接或引用識別字(由指令 #define 和 #undef,以及運算子 # 和 ## 控制)。
- 包含 (include) 其他檔案(由指令 #include 並透過 __has_include 檢查(C++17 起) 控制)。
- 引發 錯誤 或 警告(C++23 起)(分別由指令 #error 或 #warning 控制(C++23 起))。
預處理器的以下方面可被控制:
- 實作定義的行為(由指令 #pragma 及運算子 _Pragma(C++11 起) 控制)。此外,部分編譯器(在不同程度上)支援運算子 __pragma 作為一種非標準擴充。
- 檔案名稱與行號資訊(由指令 #line 控制)。
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| CWG 2001 | C++98 | 使用非標準定義指令的行為不明確 | 改為條件支援 |
[編輯] 參閱
| C++ 文件 關於 預定義巨集符號 (Predefined Macro Symbols)
| |
| C++ 文件,關於 巨集符號索引
| |
| C 文件 關於 預處理器
|