【发布时间】:2019-11-26 23:47:25
【问题描述】:
我突然想到,以下是X-macro技巧的一种更可取的风格:
#define LIST_OF_COLOURS(X) \
X(RED) \
X(GREEN) \
X(BLUE)
#define LIST_OF_FRUIT(X) \
X(APPLE) \
X(ORANGE) \
X(TOMATO)
具体来说,将X 宏传递给列表,而不是在每次实例化列表时取消定义并重新定义它。这允许:
#define X_LIST(x) x,
#define X_STRING_LIST(x) #x,
#define COMPREHENSIVE_SETUP(n, l) \
enum n { l(X_LIST) }; \
char const* n##Names[] = { l(X_STRING_LIST) };
COMPREHENSIVE_SETUP(Colour, LIST_OF_COLOURS)
COMPREHENSIVE_SETUP(Fruit, LIST_OF_FRUIT)
但问题是我不经常在野外看到这个成语,而且它不是维基百科所描述的,尽管每当我尝试它并且感觉更方便时它“似乎有效”。
我的问题是,这实际上是合法且完全定义的,还是我依赖未定义的行为?
【问题讨论】:
-
刚刚在野外遇到了这个(libuv)。有点让我大吃一惊。我只熟悉维基百科中描述的 x 宏。 github.com/libuv/libuv/blob/v1.x/include/uv.h#L1790-L1794
标签: c++ c c-preprocessor x-macros