- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
C FAQ声明 C 中的通用 SWAP 宏本质上是不可能的,也不值得付出努力。这对我来说听起来像是一个挑战。
它列举了两个主要困难:
SWAP(my_int, my_float)
等问题上失败。许多编译器都支持 decltype 风格的运算符,这使得这一切变得简单,但它们是非标准的。现在我承认失败,只是要求用户提供合适的类型作为第三个参数。#
对输入参数进行字符串化,并将它们与预期的临时变量名称进行比较,以找到不匹配的变量。#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_temp
和 int *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/
我正在尝试在我的项目中使用 SweetJS。为了更好地理解和学习 SweetJS,我想我会从一个简单的“类”宏开始(我知道有一些存在,只是在这里玩......)。然而,我似乎无法让 SweetJS 停
快一点。 我正在将一个使用 mysql 的旧 Web 应用程序迁移到 mysqli。我曾经使用我编写的自定义清理功能来防止 SQL 注入(inject): function sani($tex
我正在尝试在racket中编写一个define-let宏,它“保存”(let ((var value) ...) ...)的 header ,即只是 (var value) ... 部分,并允许稍后重
我是一名优秀的程序员,十分优秀!