/*预处理命令--宏定义*/
//宏名一般习惯用大写字母表示
//使用宏可以减少再程序中重复书写某些繁琐字符的工作量,避免不必要的错误
//宏定义只是简单地替换,不做正确性检查
//宏定义末尾不必加分号
//宏定义的有效范围是,宏定义之后到本源文件结束
//宏定义可以引用已经定义的宏,层层替换
//程序中在""中的字符即使与宏名相同也不进行替换
//宏定义只做字符替换,不分配内存
//宏替换不占用运行时间,只占用编译时间
/*宏定义的一般格式*/
//#define 宏名 需要替换地字符串
/*带参地宏定义*/
//#define 宏名(参数表) 需要替换地字符
//带参宏的展开只是将语句中的宏名后面的实参字符串代替#define命令行中的形参
//宏名和参数表的括号之间没有空格
//宏名无类型、参数也无类型只是一个符号代表
/*以下是两个宏的列子*/
//用宏定义一年中有多少秒
#define SECONDINAYEAR (365*24*60*60)
printf("SECONDINAYEAR = %d ",SECONDINAYEAR);
//定义一个标准宏 MAX 表示输入两个参数X和Y,返回其中较大者
#define MAX(A,B) ((A) > (B) ? (A) : (B))
printf("MAX = %d ",MAX(5, 6));
//但是这个宏有副作用,如下
int a[10];
for (int i = 0; i<10; i++) {
a[i] = i+1;
}
int b = 10;
int *p = &a[0];
int max = MAX(*p++, b);
printf("max = %d",max);
//相当于
//max = ((*p++) >= (b) ? (*p++) : (b));//这里将指针变量p进行了一次自加,最终p指向数组中的下一元素即a[1]=2
printf("*p = %d",*p);//在这里会输出2,数组中第一个元素
//注意在使用宏时小心地使用括号