gpt4 book ai didi

c++ - 将 "int"作为参数传递给宏

转载 作者:太空狗 更新时间:2023-10-29 20:39:45 25 4
gpt4 key购买 nike

这已经困扰我一段时间了,我在用 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 定义为函数而不是宏,这会起作用吗?

最佳答案

宏在编译前经过预处理,您几乎可以在宏中编写任何将被替换的内容。在函数参数中,您不能将数据类型作为参数传递。

旁注:

#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. 在函数中您不能将数据类型作为参数传递,所以它不会起作用。

关于c++ - 将 "int"作为参数传递给宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26727915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com