C预处理器宏

时间:2015-05-06 16:34:11

标签: c macros

我对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);
      }
}

我不知道为什么这段代码仍然有用。

2 个答案:

答案 0 :(得分:1)

因为宏做了应该做的事情。 预处理器采用了

SWAP(&data1,&data2);

并将其替换为

{int temp; temp = *data1;*data1 = *data2;*data2=temp;};

然后将其提供给编译器,编译器完成了它的工作,并且您的程序正常工作。

宏是在编译之前发生的TEXTUAL替换。

答案 1 :(得分:0)

编译时间后宏不会被删除。当处理器运行时(编译前的步骤),它会找到所有出现的SWAP并用它们的定义替换,在这种情况下,所有代码都会被扩展和编译而不会有麻烦。