預處理器
來自 cppreference.com
< cpp
預處理器在編譯前,於翻譯階段4執行。預處理的結果是一個單獨的檔案,然後傳遞給實際的編譯器。
目錄 |
[編輯] 指令
預處理指令控制預處理器的行為。每個指令佔據一行,並具有以下格式
- # 字元。
- 一個序列
- 一個換行符。
模組和匯入指令也是預處理指令。 |
(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控制,並使用__has_include檢查(C++17起))。
- 引起錯誤或警告(C++23起)(分別由指令#error或#warning控制(C++23起))。
預處理器的以下方面可以控制
- 實現定義的行為(由指令#pragma和運算子_Pragma(C++11起)控制)。此外,一些編譯器支援(不同程度地)運算子__pragma作為非標準擴充套件。
- 檔名稱和行資訊可供預處理器使用(由指令#line控制)。
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
CWG 2001 | C++98 | 使用非標準定義指令的行為不明確 | 改為條件支援 |
[編輯] 另請參閱
C++文件關於預定義宏符號
| |
C++文件關於宏符號索引
| |
C文件關於預處理器
|