使用 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
我需要根据一组通用定义来布置多个表(和结构)。为了保持一切一致,我想将所有定义放在一个地方,并使用 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