在你程序里,出现在括号里的东西是i+j,那么编译器就会用
i+j*i+j
的代码替换,如果是
#define
Power2(x)
(x)*(x),就会替换成(i+j)*(i+j),那么输出结果就是196。
同样,如果改成
#define
Power2(x)
x/x
那么代码就换替换成i+j/i+j,那么结果就是15。
宏只是字符的替换,在预处理阶段就给替换到代码中去了比如下面的代码#include
#define
MAX(x,
y)
((x)>(y)?(x):y())
int
main()
{
int
a
=
2,
b
=
4
int
m
m
=
MAX(2,
4)
printf("%d\n",
m)
return
0
}
如果你用的是gcc编译器,执行
gcc
-E
main.c
-o
main.i,打开main.i文件就可以看到他是如何替换进去的,直接拖到最后,前面的都是stdio.h中的内容。
int
main()
{
int
a
=
2,
b
=
4
int
m
m
=
((2)>(4)?(2):4())
printf("%d\n",
m)
return
0
}
函数就不同了,函数还需要分配栈空间,在执行函数时都要进行入栈和出栈操作,有的还需要分配堆空间。
宏所实现的功能有限,而且长代码不易读,但是对于逻辑简单、代码不长、经常使用的功能由宏来实现是个不错的选择