C++ 通行证;int";作为宏中的参数

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定义为函数而不是宏,那么这种方法是否有效 宏

这一直困扰着我一段时间,我在用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) 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。但不能将数据类型作为参数传递:(