【发布时间】:2012-12-12 09:46:08
【问题描述】:
我想知道是否可以构建一个 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);
【问题讨论】:
-
很难想象为什么你宁愿写
MAC(1,2,1)而不是简单地写1,2。 -
诚然,应用并不明显。我想定义一组取决于索引(MAC 的参数)的变量。但是这三个指数过度确定了变量。只需要部分信息。当然,我可以手动减少索引列表,但是如果我出错,这会导致代码不一致。
-
为什么不写一个看起来像
int * unique_list(int*, int )或void remove_duplicates(int *, int)的函数 -
@UmNyobe:表达式需要在编译前扩展,因为它应该确定变量名。