C预处理器宏

C pre-processor macros

我有一个关于C编程中宏的问题。我对宏的了解是,它们是预处理器指令,在编译阶段之前完成,然后被删除。所以我写了一段代码来测试这个,但是它在编译阶段之后仍然有效:

1
2
3
4
5
6
7
8
9
10
11
12
#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
"
,data1,data2);
      }
}

我不知道这段代码为什么还能工作。


因为宏做了它应该做的。预处理器占用了线路

1
SWAP(&data1,&data2);

换成了

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

然后把它输入编译器,编译器完成了它的工作,你的程序就可以工作了。

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


宏在编译后不会被删除。当处理器运行(编译前的步骤)时,它会找到所有出现的交换并替换为它们的定义,此时所有代码都会展开和编译,而不会出现重复。