Namespaces
Variants

Preprocessor

From cppreference.net
< c

预处理器在 翻译阶段4 执行,该阶段位于编译过程之前。预处理的结果是生成单个文件,随后该文件将被传递给实际编译器。

目录

指令

预处理指令控制预处理器的行为。每条指令独占一行并具有以下格式:

  • # 字符
  • 预处理指令(包括 define undef include if ifdef ifndef else elif elifdef elifndef (C23 起) endif line embed (C23 起) error warning (C23 起) pragma [1]
  • 参数(取决于具体指令)
  • 换行符

空指令( # 后接换行符)是允许的且不产生任何作用。

功能

预处理器具有源文件转换能力:

  • 条件编译 源文件的部分内容(通过指令 #if #ifdef #ifndef #else #elif #elifdef #elifndef (C23 起) #endif 控制)。
  • 替换 文本宏,同时可能拼接或引用标识符(通过指令 #define #undef ,以及操作符 # ## 控制)。
  • 包含 其他文件(通过指令 #include 并使用 __has_include 进行检查 (C23 起) 控制)。
  • 引发 错误 警告 (C23 起) (分别通过指令 #error #warning 控制 (C23 起) )。

以下预处理器的相关方面可以进行控制:

脚注

  1. 这些是由标准定义的指令。标准未定义其他指令的行为:它们可能被忽略、具有某些实用含义,或导致程序格式错误。即使被忽略,它们也会在预处理器处理完成后从源代码中移除。 常见的非标准扩展是指令 #warning ,它在编译期间发出用户定义的消息。 (直至 C23)

示例

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 6.10 预处理指令 (页码: 待定)
  • C17 标准 (ISO/IEC 9899:2018):
  • 6.10 预处理指令 (p: 117-129)
  • C11标准(ISO/IEC 9899:2011):
  • 6.10 预处理指令(页码:160-178)
  • C99标准(ISO/IEC 9899:1999):
  • 6.10 预处理指令(页码:145-162)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 3.8 预处理指令

参见

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