删除宏中的最后一个逗号

时间:2014-11-13 01:04:16

标签: c++ templates

我正在使用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
}

宏并不是我的强项,所以我想不出一种摆脱函数调用中最后一个逗号的方法。谁能想到一种阻止它的方法?

3 个答案:

答案 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)