任何人都可以告诉我以下代码是如何工作的,
#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)是否可以将数据类型作为参数发送。??
我不知道它是如何工作的,我知道只发送变量,结构,指针和值,但我不知道如何发送数据类型,为什么需要发送数据类型,
答案 0 :(得分:5)
我不知道那是什么类型的“c”,但似乎(如果代码编译,运行并产生预期结果):
#define func(t, a, b){ t temp; temp=a; a=b; b=temp;}
#define
是常用于创建别名(宏)的pre-processor指令。
func(...)
是类似函数的宏名称,预处理器将在您的代码中查找并替换为之后的内容。
在()
内,您可以定义参数:t
,a
和b
。每当您撰写func(1,2,3)
时,这些以逗号分隔的值都会分配给参数:t
将变为1
,a
= 2
和b
= 3
。然后将处理宏体以生成具有这些值的内联代码。因为这个替换发生在编译之前 (这是预处理代表的),有无检查或错误,您的源将被修改,只有编译发生(可能产生编译时错误。)
当您编写func(int, a, b);
行时,在预处理期间,它将被修改为
{ t temp; temp=a; a=b; b=temp;}
其中t
= int
,a
= a
和b
= b
,所以它变为
{ int temp; temp=a; a=b; b=temp;}
然后将编译。正如您所看到的,它是完全有效的代码。
特别针对您的问题,您不会在宏中发送任何类型的内容。宏使用纯文本操作,就像输入文本以生成源代码一样。
答案 1 :(得分:4)
您需要了解一些事项。首先,t
,a
和b
都被替换为宏的主体,无论它们是什么,它们都不是变量!
因此当你说:
func(int, a, b)
它被解释为:
创建一个名为temp
的变量t
(在本例中为int),然后设置temp等于a和b的值等于temp的值。
虽然它可能看起来,但这个宏不是功能!
宏的主要目的是避免重复编码,尽管你也可以使用它来执行有趣的类型无关替换,就像在这种情况下一样。