c中的宏函数如何使用引用传递

时间:2018-02-20 06:47:32

标签: c

我'在c学习宏, 我在宏中编写了一个小函数来交换数字,但是将值传递给'传递值'因为我没有在参数中的变量之前使用运算符(&)的地址,但是当我运行程序时。价值得到了转变。您可以参考代码并提及我理解错误的地方吗?

#include<stdio.h>
#include<conio.h>
#define swap(a,b) a = a+b;b = a-b; a = a-b;
int main()
{
    int x = 5, y = 10;
    swap(x,y);
    printf("%d %d\n",x,y);
    getch();
    return 0;
}

在宏中使用时,参数是否作为参考传递?

1 个答案:

答案 0 :(得分:3)

C没有传递引用。而这不是这里发生的事情。当“调用”宏时,预处理器用正文替换呼叫站点。

使用您的示例,调用

swap(x,y);

替换为

x = x+y;y = x-y; x = x-y;;

最后一行是编译器的实际解析器。

许多编译器都有在预处理步骤后停止的选项。我建议您使用它来确切了解预处理器的功能。

我也希望你能开始看到宏如何“破坏”你的代码。

例如,如果代码是

if (some_condition)
    swap(x,y);

然后它将扩展(通过一些重新格式化)

if (some_condition)
    x = x+y;
y = x-y;
x = x-y;
;

这显然不是预期的,也不会起作用。

当宏的参数不是简单变量而是表达式时,您也会遇到这种情况。像

swap(x+1,y*2)

虽然会被

取代
x+1 = x+1+y*2;y*2 = x+1-y*2; x+1 = x+1-y*2;;

这也行不通。