Preprocessor
From cppreference.net
<
cpp
预处理器在 翻译阶段4 执行,该阶段位于编译过程之前。预处理的结果是生成单个文件,随后该文件将被传递给实际编译器。
目录 |
指令
预处理指令控制预处理器的行为。每条指令独占一行并具有以下格式:
- # 字符。
- 由以下组成的序列:
- 换行符。
|
模块与导入指令 同样属于预处理指令。 |
(since C++20) |
预处理指令不得来自宏展开。
#define EMPTY EMPTY # include <file.h> // 不是预处理指令
功能特性
预处理器具有源文件转换能力:
- 条件编译 源文件的部分内容(通过指令 #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 文档
关于
预处理器
|