C宏删除参数列表中的重复项

时间:2012-12-12 09:46:09

标签: c macros p99

我想知道是否有可能构建一个扩展为令牌列表(整数)的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);

1 个答案:

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