预处理器
出自 cppreference.cn
< 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++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
CWG 2001 | C++98 | 使用非标准定义指令的行为不明确 | 变为有条件支持 |
[[编辑]] 参见
C++ 文档 关于 预定义宏符号
| |
C++ 文档 关于 宏符号索引
| |
C 文档 关于 预处理器
|