c - 如何将宏的 2 个参数拆分并重新整理为 2 个单独的宏?

标签 c macros

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

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

最佳答案

我建议使用称为 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

关于c - 如何将宏的 2 个参数拆分并重新整理为 2 个单独的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13775546/

相关文章:

c - 暂时在指针中前进

types - 如何键入注释宏的返回值?

date - 提示:日期,%Sysfunc(year(&myvar.));

scala - 如何开发短路空的宏?

C++ 连接 __func__ 和 const char 文字

macros - 宏中的动态作用域

c - 分配二维数组的怪异方式?

c - 浮点值输入错误

c - 在 C 中解析字符串,不使用 Strtok()

无法弄清楚为什么 getchar() 在 C 中第一次出现时选择换行符