我想知道是否可以构建一个 gnu C 宏,它将扩展为标记(整数)列表,这些标记是宏的参数,没有重复。参数的数量可以假设是固定的(目前)。 IE。我想要这样的东西:
#define MAC(a,b,c) ???
扩展例如
MAC(1,2,1)
到1,2
。
参数未排序,结果也不必排序。
根据下面的建议,我构建了一个示例,该示例基本上可以使用 p99 完成我想要的操作,包括:
#include <p99/p99_if.h>
#include <p99/p99_paste.h>
#define MAC2(a,b) double P99_PASTE2(myvar_, a) P99_IF_EQ(a,b)()(; double P99_PASTE2(myvar_, b))
#define MAC3(a,b,c) double P99_PASTE2(myvar_, a) P99_IF_EQ(a,b)()(; double P99_PASTE2(myvar_, b)) P99_IF_EQ(a,c)()(P99_IF_EQ(b,c)()(; double P99_PASTE2(myvar_, c)) )
MAC2(1,2);
MAC2(3,3);
MAC3(1,2,3);
MAC3(10,10,1);
最佳答案
如果您的参数始终是小十进制数字,如您的示例所示,您可以摆脱我在 P99 中提供的内容。 。它具有像 P99_IF_EQ
这样的宏,您可以将其用作
#define MAC(A,B) unsigned P99_PASTE2(myvar_, A) P99_IF_EQ(A,B)()(; unsigned P99(unsigned P99_PASTE2(myvar_, B))
MAC(1,2); // -> myvar_1 and myvar_2
MAC(3,3); // -> myvar_3
仅在 B
不等于 A
时扩展该声明。显然,对于三个不同的参数,这已经变得有点乏味,但是是可行的。
关于C 宏删除参数列表中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13836949/