在 C 语言中,以 # 开头的语句被称为预处理指令(Preprocessing Directive),它们由 C 语言的预处理程序(Preprocessor)在编译阶段之前进行处理,用于对源代码进行文本替换、条件编译、文件包含等操作,不直接参与程序的执行逻辑,但会影响最终编译的代码内容。
常见的预处理指令及其功能如下:
用于将指定文件的内容插入到当前源文件中,通常用于包含头文件(.h 文件),以便使用其中的函数声明、宏定义、类型定义等。
语法:
示例:
用于定义宏(标识符替换规则),分为无参宏和带参宏,预处理时会将代码中所有宏名替换为定义的内容。
语法:
示例:
用于取消已定义的宏,使其后续不再生效。
示例:
#define NUM 100
printf("%d\n", NUM);
用于根据条件决定是否编译某段代码,常用于跨平台开发、调试代码开关等。
按条件编译代码块,条件为常量表达式(预处理阶段计算)。
示例:
#ifdef 宏名:如果宏已被定义,则编译后续代码;
#ifndef 宏名:如果宏未被定义,则编译后续代码(等价于
#if !defined(宏名))。
示例:
判断宏是否被定义,功能类似 #ifdef,但更灵活(可结合 &&、|| 等逻辑运算符)。
示例:
#if defined(OS_WIN) && defined(DEBUG)
用于修改当前源文件的行号和文件名(主要影响编译器报错时显示的行号信息)。
示例:
当预处理遇到 #error 时,会停止编译并输出指定的错误信息,常用于检查宏定义是否符合预期。
示例:
#ifndef OS_LINUX
#error "此代码仅支持Linux系统!"
用于向编译器发送特定的指令(不同编译器支持的 #pragma 功能可能不同),例如设置对齐方式、禁用警告等。
示例:
预处理指令以 # 开头,作用于编译前的预处理阶段,主要功能包括:
- 包含头文件(
#include)
- 定义 / 取消宏(
#define/#undef)
- 条件编译(
#if/#ifdef 等)
- 辅助编译控制(
#error/#pragma 等)
它们不产生可执行代码,但通过文本处理影响最终编译的代码结构,是 C 语言中实现代码复用、跨平台兼容的重要工具。