C语言预处理器与宏完全指南:#include、#define 与条件编译
C语言预处理器与宏完全指南
探索C预处理器威力:学习包含头文件、定义常量与函数、用条件指令控制编译流程。

C预处理器在编译器前运行,通过展开宏、包含头文件、评估条件语句转换源码。它是编写灵活、可复用代码的必备工具。
所有预处理指令以 # 开头。例如:
#define PI 3.14
包含头文件:#include
#include 将头文件内容直接插入源文件。常用:
#include <stdio.h>
无 #include <stdio.h>,printf() 和 scanf() 将未定义。也可创建自定义头文件:
#include "my_header.h"
自定义头文件便于归组相关函数声明和常量。
定义常量与表达式:#define
宏在编译前用值替换标记或表达式。示例:
#define c 299792458 /* 光速 */
程序中使用 c 处处展开为 299792458。
示例 1:定义 PI
#include <stdio.h>
#define PI 3.1415
int main() {
float radius, area;
printf("输入半径: ");
scanf("%f", &radius);
area = PI * radius * radius;
printf("Area=%.2f", area);
return 0;
}
函数式宏
宏可接受参数,类似内联函数:
#define circleArea(r) (3.1415 * (r) * (r))
circleArea(5) 展开为 (3.1415 * 5 * 5)。
示例 2:使用函数式宏
#include <stdio.h>
#define PI 3.1415
#define circleArea(r) (PI * (r) * (r))
int main() {
float radius, area;
printf("输入半径: ");
scanf("%f", &radius);
area = circleArea(radius);
printf("Area = %.2f", area);
return 0;
}
条件编译
条件指令让你在编译期包含或排除代码块,类似 if 但预执行评估。
常见用例
- 针对不同操作系统或硬件。
- 创建无运行时开销的调试构建。
- 保留遗留代码路径供参考。
关键指令
#ifdef MACRO /* MACRO 定义时的代码 */ #endif
#if EXPRESSION /* 表达式非零时代码 */ #else /* 表达式为零时代码 */ #endif
#if EXPRESSION /* 代码 */ #elif ANOTHER_EXPRESSION /* 备选代码 */ #else /* 兜底代码 */ #endif
#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048 /* 缓冲区足够大 */ #endif
预定义宏
| 宏 | 值 |
|---|---|
__DATE__ | 当前编译日期字符串 |
__FILE__ | 当前文件名字符串 |
__LINE__ | 宏出现处的行号 |
__STDC__ | 遵循ANSI C标准则非零 |
__TIME__ | 当前编译时间字符串 |
示例 3:显示编译时间
#include <stdio.h>
int main() {
printf("Current time: %s", __TIME__);
return 0;
}
输出示例:
Current time: 19:54:39
推荐阅读
- 行控制
- Pragmas
- 预处理器输出
- 其他指令
C语言