预处理器
预处理器在翻译阶段4执行,编译之前。预处理的结果是一个文件,然后传递给实际的编译器。
指令
预处理指令控制预处理器的行为。每条指令占一行,格式如下:
- 一个
# . - 一系列
- 换行符。
预处理指令不得来自宏展开。
#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) | 使用非标准定义的指令的行为不明确 | 设为条件支持 |