命名空间
变体
操作

预处理器

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

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

目录

[编辑] 指令

预处理指令控制预处理器的行为。每个指令占据一行,并具有以下格式

  • # 字符。
  • 一个序列
  • 标准定义的指令名称(列于下方)后跟相应的参数,或
  • 一个或多个预处理标记,其中起始标记不是标准定义的指令名称,在这种情况下,该指令是条件支持的,其语义由实现定义(例如,一个常见的非标准扩展是指令#warning,它在编译期间发出用户定义的消息)(C++23前),或
  • 无,在这种情况下指令无效。
  • 一个换行符。

模块和导入指令也是预处理指令。

(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文档关于预处理器