预处理器

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

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

指令

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

  • # 字符
  • 预处理指令(defineundefincludeififdefifndefelseelifelifdefelifndef (C++23 起)endiflineerrorpragma 之一)[1]
  • 实参(取决于指令)
  • 换行符

允许空指令(即在 # 后直接换行),而它没有效果。

moduleimport 指令同样是预处理指令。

(C++20 起)

预处理指令不得来自宏展开。

#define EMPTY
EMPTY   #   include <file.h> // 不是预处理指令

能力

预处理器有能力翻译源文件:

  • 有条件编译源文件的某些部分(由 #if#ifdef#ifndef#else#elifelifdefelifndef (C++23 起)#endif 指令控制)。
  • 替换文本宏,同时可能对标识符进行拼接或加引号(由 #define#undef 指令与 ### 运算符控制)。
  • 包含其他文件(由 #include 指令控制并以 __has_include 检查 (C++17 起))。
  • 引发错误(由 #error 指令控制)

能控制预处理器的下列方面:

脚注

  1. 这些指令是标准定义的。标准不定义其他指令的行为:它们可以被忽略、拥有一些有用的含义或导致编译时错误。即使忽略,也会在预处理器完成工作时将它们从源码中移除。一种常用的非标准扩展是 #warning 指令,它在编译期间放出一条用户定义的消息。

参阅