我突然想到,以下是X 宏技巧的一种更可取的风格:
#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)
但问题是我不经常在野外看到这个成语,而且它不是维基百科所描述的,尽管每当我尝试它并且感觉更方便时它“似乎工作”。
我的问题是,这实际上是合法的和完全定义的,还是我依赖未定义的行为?