以#开头的命令都是预处理命令,预处理不是c语言的语句,不能被编译器编译。所以在编译之前需要使用预处理器做文件的预处理工作。在编译之前,所有的预处理语句都要被处理(替换或展开)。
eg1:一般宏定义
#define NUM 100
- 宏替换:将NUM替换为100,注:双引号的内容不会被替换
- 宏不会分配内存空间,没有数据类型
- 宏定义末尾不能有分号
- 宏定义一般要大写
- 宏定义可以定义已经定义的宏
eg2:有参数的宏定义
#define S(a,b) a*b
- 将 S(a,b) 替换为 a*b 表达式
- 注意优先级:eg---> a = 4+5,b = 10,则替换后为 4+5*10,优先算乘法
- 解决优先级问题的方法:加括号---> #define S(a,b) (a)*(b)
eg3:写一个宏,返回较大的一个
#define MAX(a,b) a>b?a:b
- 直接使用MAX(a,b) 返回较大的一个数
eg4:求一年中有多少秒(忽略闰年)
#define SECOND_YEAR (365*24*60*60)UL
- 无需自己计算具体秒数,预处理会计算
- UL作用:表示无符号长整型。这个表达式会使16位的整型数溢出,用到长整型符号L,告诉编译器这个数是长整型数
注:带参数的宏和函数的区别
- 宏展开会使源程序变长,而函数调用不会
- 宏替换不会占用运行时间,只占编译时间,而函数调用占用运行时间(分配单元,保留现场,传递指,返回)