0

我想定义一个宏,当这样使用时:

ADD_TO_OPS("abc", 3)
ADD_TO_OPS("cdef", 2)
ADD_TO_OPS("xx", 4)

, 将产生如下内容:

#define OPS_NAMES      "abc", "cdef", "xx"
#define OPS_VALUES     3, 2, 4

也就是说,我想做ADD_TO_OPS(NAME, VALUE)下面的事情(下面的代码是行不通的,只是让你看看我想要做什么):

#ifdef OPS_NAMES
#   define OPS_NAMES2   OPS_NAMES, NAME
#   undef OPS_NAMES
#else
#   define OPS_NAMES2   NAME
#endif
#define OPS_NAMES   OPS_NAMES2
#undef OPS_NAMES2

#ifdef OPS_VALUES
#   define OPS_VALUES2  OPS_VALUES, VALUE
#   undef OPS_VALUES
#else
#   define OPS_VALUES2  VALUE
#endif
#define OPS_VALUES  OPS_VALUES2
#undef OPS_VALUES2
4

1 回答 1

1

我建议使用一种叫做 X 宏的东西。该方法有些不同,您仅限于拥有一组固定的已知值:

#define OPS X_OP("abc", 3) X_OP("cdef", 2) X_OP("xx, 4)

当你使用它时,你临时定义 X_OP,选择你想要的任何东西。例如,以下内容将扩展为"abc", "cdef", "xx",(注意尾随逗号)。

#define X_OP(name, value) name,
... OPS ...
#undef X_OP

以下将扩展为3, 4, 5,

#define X_OP(name, value) value,
... OPS ...
#undef X_OP

您还可以执行更高级的操作,例如:

#define X_OP(name, value) case value: return name;
char const * value_to_name(v)
{
  switch(v)
  {
    OPS
    default: return NULL;
  }
}
#undef X_OP
于 2012-12-08T08:09:52.120 回答