【发布时间】:2021-02-17 21:51:24
【问题描述】:
我在这样的定义的帮助下初始化一个结构数组:
#define FLAGCODE(name) { #name, MNT_ ## name }
struct {
const char *name;
uint64_t flag;
} flagcodes[] = {
FLAGCODE(ACLS),
FLAGCODE(ASYNC),
...
这很好用,现在我想添加一个检查,是否在没有为每个符号插入 #ifdef 和 #endif 的情况下定义了每个标志(例如 MNT_ACLS)手动?
也就是说,我希望宏 FLAGCODE(name) 扩展为(相当于):
#ifdef MNT_ ##name
{ # name, MNT_ ##name },
#endif
例如,如果name是NOATIME,则代码变为:
#ifdef MNT_NOATIME
{ "NOATIME", MNT_NOATIME },
#endif
是的,我意识到,这意味着 double 会通过预处理器,因此不太可能 - 如果没有自定义代码生成器...但仍然...
【问题讨论】:
-
您能否发布一个示例,说明您希望做什么以防万一它起作用?
-
看看X macros。这是定义可以扩展到多个上下文的列表的常见模式。
-
我会考虑编写一个代码生成脚本,并使用它来将规范编译为必要的(详细)C 代码。您不能将
#ifdef/ ... /#endif放在宏定义的主体中。 -
您提出的模式不起作用,因为 - 正如您所说 - #if... 宏扩展后不会重新评估表单。我同意 Jonathan 的观点,即使用一种可能存在于您所针对的所有编译平台上的语言编写一个小代码生成器 - 从长远来看 - 不太可能比深度预处理器技巧更令人头疼......即使你需要使用 C,但如果你有的话,awk、perl 或 python 会更好。
-
谢谢,@Gene。当然,代码生成器是可能的——但这个问题是关于“深度预处理器技巧”:-) 有吗? 不是通过 CPP 进行双通——可以打开相同的宏如果它的参数没有定义,则变成一个空白?
标签: c preprocessor