C语言中的宏定义
#define 是预处理器处理的单元实体之一
#define定义的宏可以出现在程序的任意位置
#define定义之后的代码都可以使用这个宏
#define定义的宏常量可以直接使用
#define定义的宏常量本质为字面量,不占用任何内存
宏定义表达式
#define表达式的使用类似函数调用
#define表达式可以比函数更强大
#define表达式比函数更容易出错
求一个数组的大小
# define _DIM(a) sizeof(a)/sizeof(*a)
预编译 gcc -E a.c -o a.i
宏的性质
宏表达式被预处理器处理,编译器不知道宏表达式的存在
宏表达式用'"实参"完全替代形参,不进行任何运算
宏表达式没有“调用“开销
宏表达式不能进行递归定义
宏定义的常量或表达式是否有作用域限制? 无作用域限制
强大的内置宏
__FILE__ 被编译的文件名
__LINE__ 当前行号
__DATE__ 编译时的日期
__TIME__ 编译时的时间
__STDC__ 编译器是否遵循标注c规范
例子:
#define MALLOC(type,x) (type*)malloc(sizeof(type)*x)
#define FREE(p) (free(p),p=nullptr)
#define LOG(s) printf("[%s] {%s:%d} %s \n", _DATE_,_FILE_,_LINE_,s)
小结
预处理器直接对宏进行文本替换
宏使用时的参数不会进行求值和运算
预处理器不会对宏定义进行语法检查
宏定义时出现的语法错误只能被编译器检测
宏定义的效率高于函数调用
宏的使用会带来一定的副作用