宏定义注意点:
- 宏名一般习惯用大写字母表示
- 使用宏可以减少再程序中重复书写某些繁琐字符的工作量,避免不必要的错误
- 宏定义只是简单地替换,不做正确性检查
- 宏定义末尾不能加分号
- 宏定义的有效范围是,宏定义之后到本源文件结束
- 宏定义可以引用已经定义的宏,层层替换
- 程序中在""中的字符即使与宏名相同也不进行替换
- 宏定义只做字符替换,不分配内存
- 宏替换不占用运行时间,只占用编译时间
宏定义的一般格式:
#define 宏名 需要替换地字符串
带参的宏定义:
#define 宏名(参数表) 需要替换地字符
带参宏的展开只是将语句中的宏名后面的实参字符串代替#define命令行中的形参
宏名和参数表的括号之间没有空格
宏名无类型、参数也无类型只是一个符号代表
以下是两个宏的例子:
用宏定义一年中有多少秒
#define SECONDINAYEAR (365*24*60*60) //注意,这里不能加分号
printf("SECONDINAYEAR = %d\n",SECONDINAYEAR);
定义一个标准宏 MAX 表示输入两个参数X和Y,返回其中较大者
#define MAX(A,B) ((A) > (B) ? (A) : (B))
printf("MAX = %d\n",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,数组中第一个元素
//注意在使用宏时小心地使用括号
宏定义不要主观的给它加括号,一定要原样替换,例如:
#include f(a,b,x) a*x+b
printf("%d,%d\n",f(3,2,1),f(6,5,f(3,2,1))); //输出结果为5,25 而不是5,35,问题一般出在第二个结果25
//f(6,5,f(3,2,1))原样替换为:a*a*x+b+b,带入数值为6*3*1+2+5=25,一定不要想当然的给f(3,2,1)加括号优先计算
点击原博文地址,我稍加修改添加了一下。