我对C编程中的宏有疑问。我对宏的了解是它们是预处理器指令,并且在编译阶段之前完成并且它们被删除。所以我编写了一段代码来测试它,但它仍然可以在编译阶段之后运行:
#define SWAP(x,y) {int temp; temp = *x;*x = *y;*y=temp;}
int main()
{
int data1, data2;
while((scanf("%d%d",&data1,&data2)) == 2)
{
SWAP(&data1,&data2);
printf("Data1 =%d, data2 = %d\n",data1,data2);
}
}
我不知道为什么这段代码仍然有用。
答案 0 :(得分:1)
因为宏做了应该做的事情。 预处理器采用了
行SWAP(&data1,&data2);
并将其替换为
{int temp; temp = *data1;*data1 = *data2;*data2=temp;};
然后将其提供给编译器,编译器完成了它的工作,并且您的程序正常工作。
宏是在编译之前发生的TEXTUAL替换。
答案 1 :(得分:0)
编译时间后宏不会被删除。当处理器运行时(编译前的步骤),它会找到所有出现的SWAP并用它们的定义替换,在这种情况下,所有代码都会被扩展和编译而不会有麻烦。