使用 C 预处理器创建多个 table 布局

Using C preprocessor to create multiple table layouts

我需要根据一组通用定义来布置多个表(和结构)。为了保持一切一致,我想将所有定义放在一个地方,并使用 C 宏的魔力将定义扩展到各种表(和结构)中。

有一个问题:并非所有表格的长度都相同。问题的简化陈述如下:

// Here is the master list of things
#define THING_DEFINITIONS \
  THING(apple, true) \
  THING(pear, true) \
  THING(caddilac, false) \
  THING(mango, true)

// I want a table of all thing names -- this works fine
#undef THING
#define THING(name, is_fruit) #name,
char *all_things[] = {
  THING_DEFINITIONS
};

// Now I want a table of just fruits -- the following does not work
#undef THING
#define THING(name, is_fruit) \
#if is_fruit \
 #name,      \
#endif

char *just_fruits[] = {
  THING_DEFINITIONS
};

当然,问题是条件语句不能出现在宏定义中,至少不能像这里显示的那样。

是否有 THING 的定义,当我扩展 THING_DEFINITIONS 时它只发出水果?

根据is_fruit生成新的宏名:

// Options
#define THING_true(name) #name,
#define THING_false(name)

// Combine symbols
#define CONCAT(a, b) a ## b

// Final macro
#define THING(name, is_fruit)  CONCAT(THING_, is_fruit) (name)

这将扩展为:

THING_true(apple)
THING_true(pear)
THING_false(caddilac)
THING_true(mango)

最终将扩展为:

"apple",
"pear",

"mango",

我在Ideone上做了个小测试:http://ideone.com/TDR2WO