c预处理指令的使用
无参宏定义的语法
#define 标识符(宏名) [字符串(宏体)]
- 功能:定义可在程序中使用宏,宏的内容由字符串(宏体)替代
- 宏体可缺省,表示宏名定义过或取消宏体
- 示例
#define YES 1
#define NO 0
#define OUT printf("Hello world\n")
#define WIDTH 80
#define LENGTH (WIDTH + 40)
var = LENGTH * 2;
宏展开: var = (80 + 40) * 2;
宏的移除语法
#undef 宏名
- 功能:删除前面定义的宏
- 示例
#undef PI
#undef OUT
#undef YES
#undef NO
宏定义的规则
#
表示这是一条预处理指令,以#
开头的均为预处理指令#define
为宏定义指令,标识符为所定义的宏名- 宏名一般习惯用大写字母表示,以便与变量名相区别
- 宏定义不是c语句,不必在末尾加分号
- 字符串(宏体)可以是常数,表达式,格式化字符串等。对于数值表达式进行求值的宏定义应该使用括号
- 在进行宏定义时,可以引用已定义的宏名,可以层层替换
- 宏替换只做字符串替换,不分配内存空间,不作正确性检查
- 宏的有效范围为定义之后到本源文件结束,可以用
#undef
指令终止宏定义的作用域 - 宏定义的内容为字符串时,要以双引号扩起来,以便与已定义的宏作区分
带参宏定义
示例
#define MAX(a,b) (a > b ? a : b)
int main(void)
{
printf("%d\n",MAX(1,2));
return 0;
}
带参宏定义和带参函数很相似,但有本质上的不同
对比 | 带参宏定义 | 带参函数 |
---|---|---|
处理时间 | 编译时 | 程序运行时 |
参数类型 | 无类型问题 | 定义实参和新参类型 |
处理过程 | 不分配内存,简单的字符串替换 | 分配内存先求实参值再传给形参 |
程序长度 | 变长 | 不变 |
运行速度 | 不占运行时间 | 调用和返回时间 |
支持递归 | 不支持 | 支持 |