0

我想知道是否可以构建一个 gnu C 宏,该宏扩展为一个标记列表(整数),这些标记是没有重复的宏的参数。可以假设参数的数量是固定的(目前)。即我想要类似的东西:

#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);
4

1 回答 1

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。显然,对于三个不同的论点,这已经变得有点乏味,但也是可行的。

于 2012-12-12T10:42:42.613 回答