更新:2025-02-14 17:11:39|关注1 人
预处理器在编译前的翻译阶段 4 执行。预处理的结果是单个文件,接下来它会被传递给实际编译器。
预处理指令控制预处理器的行为。每个指令占据一行并拥有下列格式:
# 字符
包含以下内容的序列:
由标准定义的指令名(见下文)后随对应的实参,或
一个或多个预处理记号,其中第一个记号不是由标准定义的指令名,此时该指令受条件性支持并且语义由实现定义(例如常用的非标准扩展预处理指令 #warning 会在编译时放出一条用户定义的消息),或
什么也不含,此时该指令没有效果。
换行符
| (C++20 起) |
预处理指令不得来自宏展开。
#define EMPTYEMPTY # 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 起) 控制)。
能控制预处理器的下列方面:
由实现定义的行为(由 #pragma 指令和 _Pragma 运算符(C++11 起)控制)。
对预处理器可用的文件名和行信息(由 #line 指令控制)
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
CWG 2001 | C++98 | 使用未由标准定义的预处理指令的行为不明确 | 受条件性支持 |
声明:以上是华未云整理的全部内容。本站资源来自及互联网公开收集,仅限学习交流使用,请遵循相关法律法规,如有侵权争议、不妥之处请联系本站删除处理!