1、关于宏的副作用,请看下面代码:
- #include stdio.h>
- #define GOODDEF (input+3)
- #define POORDEF input+3 //这里是宏的副作用最经典的例子,不穿裤子!!!如果你这样用,下面你就知错!!
- int main()
- {
- int input;
- printf("input first number:");
- scanf("%d",&input);
- printf("after Mul,the 5*GOODDEF=%d,即5*(%d+3)\n",5*GOODDEF,input);
- printf("input second number:");
- scanf("%d",&input);
- printf("after Mul,this 5*POORDEF=%d,即5*%d+3\n",5*POORDEF,input);
- // #undef GOODDEF
- printf("input third number:");
- scanf("%d",&input);
- printf("after Mul,the 5*GOODDEF=%d,即5*(%d+3)\n",5*GOODDEF,input);
- }
执行效果
[root@localhost preProcess]# ./hello
input first number:8
after Mul,the 5*GOODDEF=55,即5*(8+3)
input second number:8
after Mul,this 5*POORDEF=43,即5*8+3
(上一行出现该结果是因为上面宏定义不穿裤子造成的!!必须引以为戒)
input third number:8
after Mul,the 5*GOODDEF=55,即5*(8+3)
[root@localhost preProcess]#
input third number:8
after Mul,the 5*GOODDEF=55,即5*(8+3)
[root@localhost preProcess]#
如果将源码中的 // #undef GOODDEF 打开,会编译出错,如下:
hello.c: 在函数‘main’中:
hello.c:21: 错误:‘GOODDEF’未声明(在此函数内第一次使用)
hello.c:21: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
hello.c:21: 错误:所在的函数内也只报告一次。)
hello.c:21: 错误:‘GOODDEF’未声明(在此函数内第一次使用)
hello.c:21: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
hello.c:21: 错误:所在的函数内也只报告一次。)
从上面的报警信息可以知道,因为GOODDEF 这个宏被撤消,搞得这个GOODDEF 变以了野宏的原因。