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 に答える