我想知道是否有可能构建一个扩展为令牌列表(整数)的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);
答案 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
。显然,对于三个不同的论点,这已经变得有点乏味,但是可行。