预处理器

来自cppreference.com
< cpp
 
 
C++ 语言
 
 

预处理器在编译前的翻译阶段 4 执行。预处理的结果是单个文件,接下来它会被传递给实际编译器。

指令

预处理指令控制预处理器的行为。每个指令占据一行并拥有下列格式:

  • # 字符
  • 包含以下内容的序列:
  • 由标准定义的指令名(见下文)后随对应的实参,或
  • 一个或多个预处理记号,其中第一个记号不是由标准定义的指令名,此时该指令受条件性支持并且语义由实现定义(例如常用的非标准扩展预处理指令 #warning 会在编译时放出一条用户定义的消息),或
  • 什么也不含,此时该指令没有效果。
  • 换行符

moduleimport 指令也是预处理指令。

(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 使用未由标准定义的预处理指令的行为不明确 受条件性支持

参阅