Namespaces
Variants

Preprocessor

From cppreference.net
C++ language
General topics
Preprocessor
Comments
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

预处理器在 翻译阶段4 执行,该阶段位于编译过程之前。预处理的结果是生成单个文件,随后该文件将被传递给实际编译器。

目录

指令

预处理指令控制预处理器的行为。每条指令独占一行并具有以下格式:

  • # 字符。
  • 由以下组成的序列:
  • 标准定义的指令名称( 如下所列 )后跟相应参数,或
  • 一个或多个 预处理记号 ,且起始记号不是标准定义的指令名称,此时该指令为有条件支持且具有实现定义语义 (例如常见的非标准扩展是指令 #warning ,其在编译期间发出用户定义的消息) (直至 C++23) ,或
  • 空内容,此时该指令不产生任何效果。
  • 换行符。

模块与导入指令 同样属于预处理指令。

(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 起) )。

以下预处理器的相关方面可以进行控制:

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告 适用范围 发布时行为 正确行为
CWG 2001 C++98 使用非标准定义指令的行为不明确 改为有条件支持

参见

C++ 文档 关于 预定义宏符号
C++ 文档 关于 宏符号索引
C 文档 关于 预处理器