#define func(t,a,b){t temp;温度= A; A = B; B =温度;}

时间:2014-11-13 14:56:22

标签: c

任何人都可以告诉我以下代码是如何工作的,

#define func(t, a, b){  t temp; temp=a; a=b; b=temp;}

int main()
{

int a=3, b=4;
float c=4.5, d=5.99;

func(int, a, b);
func(float, c, d);

printf("%d %d\n", a,b);
printf("%.2f %.2f\n",c,d);

return 0;
}

这将提供交换输出,如下所示

4 3
5.99 4.50

我的问题是

1)是“#define func(”是一个带有可变参数的函数.. ??

2)为什么“临时”;没有给出任何错误??

3)是否可以将数据类型作为参数发送。??

我不知道它是如何工作的,我知道只发送变量,结构,指针和值,但我不知道如何发送数据类型,为什么需要发送数据类型,

2 个答案:

答案 0 :(得分:5)

我不知道那是什么类型的“c”,但似乎(如果代码编译,运行并产生预期结果):

#define func(t, a, b){  t temp; temp=a; a=b; b=temp;}

#define是常用于创建别名(宏)的pre-processor指令。 func(...)类似函数的宏名称,预处理器将在您的代码中查找并替换为之后的内容

()内,您可以定义参数tab。每当您撰写func(1,2,3)时,这些以逗号分隔的值都会分配给参数:t将变为1a = 2b = 3。然后将处理宏体以生成具有这些值的内联代码。因为这个替换发生在编译之前 (这是预处理代表的),有无检查或错误,您的源将被修改,只有编译发生(可能产生编译时错误。)

当您编写func(int, a, b);行时,在预处理期间,它将被修改为

{  t temp; temp=a; a=b; b=temp;}

其中t = inta = ab = b,所以它变为

{  int temp; temp=a; a=b; b=temp;}

然后将编译。正如您所看到的,它是完全有效的代码。

特别针对您的问题,您不会在宏中发送任何类型的内容。宏使用纯文本操作,就像输入文本以生成源代码一样。

答案 1 :(得分:4)

您需要了解一些事项。首先,tab都被替换为宏的主体,无论它们是什么,它们都不是变量!

因此当你说:

func(int, a, b)

它被解释为:

创建一个名为temp的变量t(在本例中为int),然后设置temp等于a和b的值等于temp的值。

虽然它可能看起来,但这个宏不是功能!

宏的主要目的是避免重复编码,尽管你也可以使用它来执行有趣的类型无关替换,就像在这种情况下一样。