我正在使用X宏模式来保持一堆数组/项同步,我想从中创建一个参数列表,但是我无法找到一种方法来获得格式良好的列表。这就是我的意思:
#define MY_DATA \
X(var_one, e_one, 1) \
X(var_two, e_two, 2) \
X(var_three, e_three, 3) \
#define X(a,b,c) b,
enum MyNumbers {
MY_DATA
};
#undef X
#define X(a,b,c) c,
int MyValues[] = {
MY_DATA
};
#undef X
void my_func(int a, int b, int c) {} // example do-nothing proc
void main(void)
{
int var_one = MyValues[e_one];
int var_two = MyValues[e_two];
int var_three = MyValues[e_three];
#define X(a,b,c) a,
my_func(MY_DATA); // this fails because of the trailing comma
#undef X
}
宏并不是我的强项,所以我想不出一种摆脱函数调用中最后一个逗号的方法。谁能想到一种阻止它的方法?
答案 0 :(得分:2)
查看Boost Preprocessor库中的“预处理器元编程工具,包括重复和递归。”
即使您没有使用完整的软件包,我链接的章节也会解释一些技术,特别是包括构建数据结构和语句的迭代。
这是一个想法:写
my_func(MY_DATA 0);
并声明my_func采用额外的(忽略的)参数。
void my_func(int a, int b, int c, int)
答案 1 :(得分:1)
我经常使用这种模式的变体。但是,它通常用于定义数据之间的映射。与此相符:
MESSAGE(10, "Some error message"),
MESSAGE(11, "Som other error message"),
在您的方法中没有意义的是,通常这些构造用于大量条目(100s,1000s)。你通常不希望函数有那么多参数。
如果您真的想要遵循这种方法,可以添加另一个MACRO
#define MY_DATA \ X(var_one,e_one,1)COMMA \ X(var_two,e_two,2)COMMA \ X(var_three,e_three,3)\
并在定义X时根据需要定义逗号。(或者你可以直接输入逗号)。
答案 2 :(得分:0)
这是一个选项:
void my_func(int a, int b, int c, int dummy) {}
// ...
my_func(MY_DATA 0);
如果你不能改变my_func
那么做一个thunk(即一个调用my_func的中间函数)
第二个选项是将逗号添加到MY_DATA
宏而不是X
中:
#define MY_DATA \
X(var_one, e_one, 1), \
X(var_two, e_two, 2), \
X(var_three, e_three, 3)