宏:Macro,是一种批量处理的称谓。
宏是一种规则或模式,或称语法替换。
在预编译时进行,称作宏展开。
C语言中的宏定义:
1)#define是预处理器处理的单元实体之一;
2)#define定义的宏可以出现在程序的任意位置;
3)#define定义之后的代码都可以使用这个宏。
定义宏常量:
1)可以直接使用;
2)本质为字面量。
宏定义表达式:
1)#define表达式的使用类似函数调用,但是宏定义是原地展开,没有调用开销,而函数是跳转执行再返回,有比较大的开销;
2)#define表达式比函数更容易出错,因为宏定义不会进行语法分析,类型检查,只是文本替换,出错后原因也更难找;
3)宏表达式只会直接文本直接替换,用“实参”完全替代形参,不进行任何运算;
4)宏表达式被预处理器处理,编译器不知道宏表达式的存在;
5)宏表达式中不能出现递归定义。
宏与作用域:
1)宏定义并没有作用域的限制;
2)#define定义之后的代码都可以使用这个宏。
内置宏:
__FILE__ 被编译的文件名
__LINE__ 当前行号
__DATE__ 编译时的日期
__TIME__ 编译时的时间
__STDC__ 编译器是否遵循标准C规范
宏规范写法:
1)宏名大写;
2)宏定义语句末尾不加分号;
3)宏函数的形式参数不加类型。
注意:
1)宏定义可以嵌套;
2)宏定义不能出现在字符串的“”中;
3)宏定义不分配内存,变量定义才分配内存;
4)宏定义只是简单的替换,而且是直接对源码的字符串替换;
5)宏函数和自定义函数相比,效率更高但是安全性低且会使编译生成的目标文件变大;宏函数没有分配和释放栈帧、传参、传返回值等一系列工作,适合那些简短并且频繁调用的函数。
参考:https://blog.csdn.net/small_prince_/article/details/80575896
https://blog.csdn.net/abc_12366/article/details/79155540