预处理器
来自cppreference.com
< cpp
C++ 语言
一般主题 | |||||||||||
|
|||||||||||
流程控制 | |||||||||||
条件执行语句 | |||||||||||
重复语句(循环) | |||||||||||
跳转语句 | |||||||||||
函数 | |||||||||||
函数声明 | |||||||||||
Lambda 函数声明 | |||||||||||
inline
说明符
|
|||||||||||
动态异常说明 (C++20 前) | |||||||||||
noexcept
说明符
(C++11)
|
|||||||||||
异常 | |||||||||||
命名空间 | |||||||||||
类型 | |||||||||||
说明符 | |||||||||||
|
|||||||||||
存储期说明符 | |||||||||||
初始化 | |||||||||||
表达式 | ||||||||||||||||
替代表示 | ||||||||||||||||
字面量 | ||||||||||||||||
布尔 - 整数 - 浮点 | ||||||||||||||||
字符 - 字符串 - nullptr (C++11) | ||||||||||||||||
用户定义 (C++11) | ||||||||||||||||
工具 | ||||||||||||||||
属性 (C++11) | ||||||||||||||||
类型 | ||||||||||||||||
typedef
声明
|
||||||||||||||||
类型别名声明 (C++11) | ||||||||||||||||
类型转换 | ||||||||||||||||
隐式转换 - 显式转换 | ||||||||||||||||
static_cast - dynamic_cast | ||||||||||||||||
const_cast - reinterpret_cast | ||||||||||||||||
内存分配 | ||||||||||||||||
类 | ||||||||||||||||
特定于类的函数性质 | ||||||||||||||||
|
||||||||||||||||
特殊成员函数 | ||||||||||||||||
模板 | ||||||||||||||||
杂项 | ||||||||||||||||
预处理器
(C++23)(C++23)
|
||||
(C++17)
|
||||
(C++23)
|
||||
(C++11)
|
||||
预处理器在编译前的翻译阶段 4 执行。预处理的结果是单个文件,接下来它会被传递给实际编译器。
指令
预处理指令控制预处理器的行为。每个指令占据一行并拥有下列格式:
- # 字符
- 包含以下内容的序列:
- 换行符
|
(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 起) 控制)。
能控制预处理器的下列方面:
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
CWG 2001 | C++98 | 使用未由标准定义的预处理指令的行为不明确 | 受条件性支持 |