第二十一课 宏定义与使用分析
C语言中的宏定义
#define是预处理器处理的单元实体之一
#define定义的宏可以出现在程序的任意位置
#define定义之后的代码都可以使用这个宏
定义宏常量
#define定义的宏常量可以直接使用
#define定义的宏常量本质为字面量(不占用内存空间)
下面的宏常量定义正确吗?完全正确,但编译不过去,3,4句语法不符合C语言
21-1 宏定义分析
宏定义表达式
#define表达式的使用类似函数调用
#define表达式可以比函数更强大
#define表达式比函数更容易出错
下面的宏表达式定义正确吗?
21-2宏表达式分析
宏表达式与函数的对比
宏表达式被预处理器处理,编译器不知道宏表达式的存在
宏表达式用“实参”完全替代形参,不进行任何运算
宏表达式没有任何的“调用”开销
宏表达式中不能出现递归定义
这种方式是错误的
有趣的问题:宏定义的常量或表达式是否由作用域限制?
下面的程序合法吗?
21-3 宏作用域示例
强大的内置宏
宏 | 含义 | 示例 |
---|---|---|
FILE | 被编译的文件名 | file1.c |
LINE | 当前行号 | 25 |
DATE | 编译时的日期 | Jan 31 2012 |
TIME | 编译时的时间 | 17:01:01 |
STDC | 编译器是否遵循标准C规范 | 1 |
21-4 宏使用综合示例
小结:
预处理器直接对宏进行文本替换(会出现歧义)
宏使用时的参数不会进行求值和运算
预处理器不会对宏定义进行语法检查
宏定义时出现的语法错误只能被编译器检查
宏定义的效率高于函数调用
宏的使用会带来一定的副作用