gpt4 book ai didi

c - C 中的卫生宏

转载 作者:行者123 更新时间:2023-11-30 19:00:43 26 4
gpt4 key购买 nike

C FAQ声明 C 中的通用 SWAP 宏本质上是不可能的,也不值得付出努力。这对我来说听起来像是一个挑战。

它列举了两个主要困难:

  1. 寻找合适的类型用作临时变量。有涉及 char[] 数组和 memcopy 的 hack,但这种解决方案在 SWAP(my_int, my_float) 等问题上失败。许多编译器都支持 decltype 风格的运算符,这使得这一切变得简单,但它们是非标准的。现在我承认失败,只是要求用户提供合适的类型作为第三个参数。
  2. 为临时变量找到一个安全的名称。我想我有一个解决方案。我可以使用字符串化运算符# 对输入参数进行字符串化,并将它们与预期的临时变量名称进行比较,以找到不匹配的变量。
#include <stdio.h>

#define SWAP(a,b,type) \
do { \
if ((#a[0] != 'a') && (#b[0] != 'a')){ \
type a_temp = a; \
a = b; \
b = a_temp; \
}else \
if ((#a[0] != 'b') && (#b[0] != 'b')){ \
type b_temp = a; \
a = b; \
b = b_temp; \
}else \
if ((#a[0] != 'c') && (#b[0] != 'c')){ \
type c_temp = a; \
a = b; \
b = c_temp; \
} \
} while(0)

int main()
{
int a_temp = 10, b_temp = 20, c_temp = 30;

printf("a_temp = %d, b_temp = %d, c_temp = %d\n", a_temp, b_temp, c_temp);
SWAP(a_temp, b_temp, int);
printf("a_temp = %d, b_temp = %d, c_temp = %d\n", a_temp, b_temp, c_temp);
SWAP(a_temp, c_temp, int);
printf("a_temp = %d, b_temp = %d, c_temp = %d\n", a_temp, b_temp, c_temp);
SWAP(b_temp, c_temp, int);
printf("a_temp = %d, b_temp = %d, c_temp = %d\n", a_temp, b_temp, c_temp);

return 0;
}

我在很多讨论中都看到了意外捕获的问题,但没有看到有人提到你可以这样做,无论是推荐还是谴责它。这是个好主意吗?

最佳答案

如果变量是左值表达式,这在某些情况下会失败,例如,如果您有 int *a_tempint *b_temp ,并且您有 SWAP(*a_temp, *b_temp, int) 。由于宏默默地使用“常见”名称,例如 a_temp ,因此如果存在 #define a_temp *a 之类的名称,它可能会中断。

无论如何,它可以说不是通用的,因为你必须传递类型: SWAP(a, b, int)SWAPINT(a, b) 没有本质上的不同。如果我们接受传递类型,我们是否也可以接受传递临时变量的名称?或者甚至是像 _tmpswap0123456789 这样的固定临时变量名称 - 毕竟,我们接受更常见的名称 SWAP 现在定义为这个宏,因此担心其中的临时变量名称似乎是次要的。

关于c - C 中的卫生宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59093425/

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