C++ 通行证;int";作为宏中的参数
这一直困扰着我一段时间,我在用C语言解决一些客观类型的问题时遇到了这个问题C++ 通行证;int";作为宏中的参数,c++,c,macros,C++,C,Macros,这一直困扰着我一段时间,我在用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); } 代码给出了正确答案: 在C语言中,我们应该只传递一个数据类型作为参数。这应该在这里起作用,但我想知道如何进行。还有两个与此相关的问题: 如果我想使用指针交换,它会工作吗 如果将SWAP定义为函数而不是宏,那么这种方法是否有效 宏
#define SWAP(a,b,c) c t;t=a;a=b;b=t;
int main() {
int x=10,y=20;
SWAP(x,y,int);
}
代码给出了正确答案:
在C语言中,我们应该只传递一个数据类型作为参数。这应该在这里起作用,但我想知道如何进行。还有两个与此相关的问题:
宏是在编译之前预处理的,您实际上可以在宏中编写任何要替换的内容。在函数参数中,不能将数据类型作为参数传递 旁注:
#define SWAP(a,b,c) do { c t;t=a;a=b;b=t; } while(0)
是比您提到的更安全的宏实现。而且t这个名字很常见。如果参数名中的任何一个为t,这将无法按预期工作,因此最好选择一些罕见的名称。在宏观定义中,通常首选大写字母
例如:#定义交换(a,b,c)执行{c宏临时;宏临时=a;a=b;b=宏临时;}而(0)
SWAP(x,y,int)代码>变为ct;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;;
}
$
$cat q26727935.c
#定义互换(a、b、c)和互换(t);t=a;a=b;b=t;
int main(){
int x=10,y=20;
互换(x,y,int);
}
$gcc-E q26727935.c
#1“q26727935.c”
# 1 ""
# 1 ""
#1“q26727935.c”
int main(){
int x=10,y=20;
int t;t=x;x=y;y=t;;
}
$
宏是在预处理器阶段替换的,所以,尽管这是多余的
在函数中,您不能将数据类型作为参数传递,所以它将不起作用
对
没有
首先,您必须知道,当您使用宏时,参数将按原样替换。所以,如果调用SWAP(a,b,int*),它将替换为
int* t;t=a;a=b;b=t;
然后将编译代码
但是当您使用函数时,这种情况不会发生,并且您无法将数据类型作为参数传递给函数。为什么不需要do while位?大括号是though@EdHeal大括号将使变量成为局部变量。do while将使该宏在块(do/if/while等)下可用,而不需要{}
。。但是你的例子中有大括号?@EdHeal你甚至可以在宏中使用符号:#定义OP(a,b,OP)a OP b
,然后是if(OP(3,5,@Tushar)我对你的第二个问题的理解是“你想编写通用SWAP()函数来交换任何数据类型的值”。并且可以使用template。但不能将数据类型作为参数传递:(