跳到主要内容

预处理器

预处理器在翻译阶段4执行,编译之前。预处理的结果是一个文件,然后传递给实际的编译器。

指令

预处理指令控制预处理器的行为。每条指令占一行,格式如下:

  • 一个#.
  • 一系列
    • 一个标准定义的指令名称(如下列出),后跟相应的参数,或者
    • 一个或多个预处理标记,其中起始标记不是标准定义的指令名称。在这种情况下,该指令是条件支持的,具有实现定义的语义(例如,一个常见的非标准扩展是指令#warning,它在编译期间发出用户定义的消息 (直到 C++23)),或者
    • 空,在这种情况下,指令不起作用。
  • 换行符。
模块和 import 指令也是预处理指令。 (自 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)使用非标准定义的指令的行为不明确设为条件支持

预处理器

预处理器在翻译阶段4执行,编译之前。预处理的结果是一个文件,然后传递给实际的编译器。

指令

预处理指令控制预处理器的行为。每条指令占一行,格式如下:

  • 一个#.
  • 一系列
    • 一个标准定义的指令名称(如下列出),后跟相应的参数,或者
    • 一个或多个预处理标记,其中起始标记不是标准定义的指令名称。在这种情况下,该指令是条件支持的,具有实现定义的语义(例如,一个常见的非标准扩展是指令#warning,它在编译期间发出用户定义的消息 (直到 C++23)),或者
    • 空,在这种情况下,指令不起作用。
  • 换行符。
模块和 import 指令也是预处理指令。 (自 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)使用非标准定义的指令的行为不明确设为条件支持