这一直困扰着我一段时间,我在用C语言解决一些客观类型的问题时遇到了这个问题。
#define SWAP(a,b,c) c t;t=a;a=b;b=t;
int main() {
int x=10,y=20;
SWAP(x,y,int);
}
代码给出了正确的答案: Working code
在C中我们应该只传递一个数据类型作为参数。这应该在这里工作,但我想知道如何。还有两个与此相关的问题:
答案 0 :(得分:4)
在编译之前对宏进行预处理,您可以虚拟地在要替换的宏中写入任何内容。在函数参数中,您不能将数据类型作为参数传递。
旁注:
#define SWAP(a,b,c) do { c t;t=a;a=b;b=t; } while(0)
是一个比你提到的更安全的宏实现。此外,名称t很常见。如果参数名称中的任何一个是t,那么这不会按预期工作,所以最好选择一些罕见的名称。大写字母通常在宏定义中是首选。
代表:#define SWAP(a,b,c) do { c MACRO_TEMP_;MACRO_TEMP_=a;a=b;b=MACRO_TEMP_; } while(0)
SWAP(x,y,int);
变为c t;t=a;a=b;b=t;
,其中c的所有出现都用int替换,a用x替换,b用y替换。导致:ìnt t; t = x; x = y; y = t;
为了更好地理解宏,您可以看到代码的预处理输出。在我的电脑上输出:
$ cat q26727935.c
#define SWAP(a,b,c) c t;t=a;a=b;b=t;
int main() {
int x=10,y=20;
SWAP(x,y,int);
}
$ gcc -E q26727935.c
# 1 "q26727935.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "q26727935.c"
int main() {
int x=10,y=20;
int t;t=x;x=y;y=t;;
}
$
宏在预处理器阶段被替换,所以swap will work even with pointers,虽然这是多余的。
在函数中,您无法将数据类型作为参数传递,因此无法正常工作。
答案 1 :(得分:1)
首先,你必须知道当你使用宏时,参数将被替换。因此,如果您调用SWAP(a,b,int *),它将替换为
int* t;t=a;a=b;b=t;
然后编译代码。
但是,当您使用功能时,这种情况不会发生,而且您无法将数据类型作为参数传递给函数。