传递" int"作为宏的论点

时间:2014-11-04 04:45:41

标签: 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);     
}

代码给出了正确的答案: Working code

在C中我们应该只传递一个数据类型作为参数。这应该在这里工作,但我想知道如何。还有两个与此相关的问题:

  1. 如果我想使用指针交换,它是否可行
  2. 如果将SWAP定义为函数而不是宏,这是否有效。

2 个答案:

答案 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;;
}
$ 
  1. 宏在预处理器阶段被替换,所以swap will work even with pointers,虽然这是多余的。

  2. 在函数中,您无法将数据类型作为参数传递,因此无法正常工作。

答案 1 :(得分:1)

  1. 没有
  2. 首先,你必须知道当你使用宏时,参数将被替换。因此,如果您调用SWAP(a,b,int *),它将替换为

    int* t;t=a;a=b;b=t;
    

    然后编译代码。

    但是,当您使用功能时,这种情况不会发生,而且您无法将数据类型作为参数传递给函数。