预处理器
< 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 起) 控制)。 
能控制预处理器的下列方面:
脚注
- ↑ 这些指令是标准定义的。标准不定义其他指令的行为:它们可以被忽略、拥有一些有用的含义或导致编译时错误。即使忽略,也会在预处理器完成工作时将它们从源码中移除。一种常用的非标准扩展是 
#warning指令,它在编译期间放出一条用户定义的消息。 (C23 前) 
引用
- C17 标准(ISO/IEC 9899:2018):
 
- 
- 6.10 Preprocessing directives (第 117-129 页)
 
 
- C11 标准(ISO/IEC 9899:2011):
 
- 
- 6.10 Preprocessing directives (第 160-178 页)
 
 
- C99 标准(ISO/IEC 9899:1999):
 
- 
- 6.10 Preprocessing directives (第 145-162 页)
 
 
- C89/C90 标准(ISO/IEC 9899:1990):
 
- 
- 3.8 PREPROCESSING DIRECTIVES