关注我们
  • 公众号

  • 抖音号

  • 小程序

联系方式: 400-8162-938
栏目导航

C++之预处理器

来源:华未云

更新:2025-02-14 17:11:39|关注1

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

指令

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

  • # 字符

  • 包含以下内容的序列:


    • 由标准定义的指令名(见下文)后随对应的实参,或

    • 一个或多个预处理记号,其中第一个记号不是由标准定义的指令名,此时该指令受条件性支持并且语义由实现定义(例如常用的非标准扩展预处理指令 #warning 会在编译时放出一条用户定义的消息),或

    • 什么也不含,此时该指令没有效果。

  • 换行符

module 和 import 指令也是预处理指令。

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


声明:以上是华未云整理的全部内容。本站资源来自及互联网公开收集,仅限学习交流使用,请遵循相关法律法规,如有侵权争议、不妥之处请联系本站删除处理!