命名空间
变体
操作

预处理器

来自 cppreference.com
< cpp
 
 
C++ 语言
表达式
替代表示
字面量
布尔型 - 整数型 - 浮点型
字符型 - 字符串型 - nullptr (C++11)
用户定义 (C++11)
实用程序
属性 (C++11)
类型
typedef 声明
类型别名声明 (C++11)
强制转换
内存分配
类特定的函数属性
explicit (C++11)
static

特殊成员函数
模板
其他
 
 

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

内容

[编辑] 指令

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

  • the # 字符。
  • 一个序列
  • 标准定义的指令名称(列出 下面)后跟相应的参数,或
  • 一个或多个 预处理标记,其中第一个标记不是标准定义的指令名称,在这种情况下,指令在实现定义的语义下有条件地支持 (例如,一个常见的非标准扩展是指令 #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++ 标准。

DR 应用于 已发布的行为 正确行为
CWG 2001 C++98 使用非标准定义指令的行为不清楚 被条件支持

[编辑] 参见

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