预处理器
来自 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++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
CWG 2001 | C++98 | 使用非标准定义指令的行为不明确 | 改为条件支持 |
[编辑] 另请参阅
C++文档关于预定义宏符号
| |
C++文档关于宏符号索引
| |
C文档关于预处理器
|