一、宏定义的规则和使用解析
- 宏定义的解析规则是:在预处理阶段由预处理器进行替换,这个替换是原封不动的替换。
- 宏定义可以被递归替换,直达替换出来的值本身不再是一个宏为止。
- 一个正确的宏定义的分为三部分,宏名在替换体前面。
- 宏可以带参数称为带参宏,带参宏的使用和带参函数非常类似,但使用上有差异。每一个参数在宏体中引用时都必须加括号整体也要加括号。
#define M 10
#define N M
int main(void)
{
int a[N]={1,2,3};
retutn 0;
}
预处理后:
int main(void)
{
int a[10]={1,2,3};
retutn 0;
}
带参宏
#include <stdio.h>
#define X(a,b) a+b
int main(void)
{
int x=1,y=2;
int c=X(x,y);
int d=3*X(x,y);
printf("d=%d.\n,d");
retutn 0;
}
预处理后:
int main(void)
{
int x=1,y=2;
int c=a+b;
int d=3*a+b; //出错
printf("d=%d.\n,d");
retutn 0;
}
二、宏定义示例1:MAX
- 求两个数中较大的那个。
- 想到三目运算符来完成。
- 注意括号的使用。
#include <stdio.h>
#define MAX(a,b) (((a)>(b))?(a):(b))
int main(void)
{
int x=3,y=4;
int max=MAX(2+x,y);
printf("max=%d.\n,MAX");
return 0;
}
三、宏定义示例2:SEC_PER_YEAR
- 计算一年有多少秒。
- 当一个数字直接出现在程序中,它的类型默认是int。这个数字刚好超过了int的存储范围。
#define SEC_PER_YEAR (365*24*60*60UL)
int main(void)
{
unsigned int i=SEC_PER_YEAR;
return 0;
}