1:宏的规则和使用
@1:宏定义的解析规则:预处理阶段由预处理器进行替换,这个替换是原封不动的替换。
@2:宏定义的组成 :第一部分是 #define ,第二部分是宏名,剩下的所有为第三部分。
@3:带参宏 : 带参宏的使用和带参函数非常像,但是使用上有一些差异。
在定义带参宏时,每一个参数在宏体中引用时都必须加括号,最后整体再加括号,括号缺一不可。
2:宏的使用
@1:宏定义示例1:MAX宏,求2个数中较大的一个#define MAX(a, b) (((a)>(b)) ? (a) :(b))
关键点注意: 注意参数加括号, 运算符
@2:宏定义示例2:SEC_PER_YEAR,用宏定义表示一年中有多少秒 #define SEC_PER_YEAR (365*24*60*60 UL)
错误方法:#define SEC_PER_YEAR(365*24*60*60) // 宏定义默认int类型,超过类型存储范围了
#define SEC_PER_YEAR(365*24*60*60)UL
// 实际测试 gcc 中编译错误
关键点 :UL表示 表示16进制 长整型 ( 不确定, ) 。 或者表示无符号长整型。
3:带参宏和带参函数
@区别1: 宏定义是在预处理期间处理的,而函数是在编译期间处理的。
调用宏时,原地展开宏。调用函数时要跳转到函数内部执行函数,执行结束后再跳转回来。
相对来说,调用函数较为复杂,占用资源较多。调用宏的优势在于没有传参。
因此函数较短的情况下,使用宏定义代替可以提高效率。
@区别2:宏定义不会分辨类型(没有类型)。函数既有参数类型,也有返回值类型。
用函数的时候程序员不太用操心类型不匹配因为编译器会检查,如果不匹配编译器会叫;
用宏的时候程序员必须很注意实际传参和宏所希望的参数类型一致,否则可能编译不报错但是运行有误。
4: 宏定义和程序的 debug 版本,与release 版本有关系。
程序有DEBUG版本和RELEASE版本,区别就是编译时有无定义DEBUG宏。