以#开头的命令都是预处理命令,预处理不是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,告诉编译器这个数是长整型数

注:带参数的宏和函数的区别

  1. 宏展开会使源程序变长,而函数调用不会
  2. 宏替换不会占用运行时间,只占编译时间,而函数调用占用运行时间(分配单元,保留现场,传递指,返回)