gpt4 book ai didi

c - #ifdef 在#define 里面?

转载 作者:行者123 更新时间:2023-12-04 15:05:21 30 4
gpt4 key购买 nike

我在这样的定义的帮助下初始化一个结构数组:

#define FLAGCODE(name) { #name, MNT_ ## name }
struct {
const char *name;
uint64_t flag;
} flagcodes[] = {
FLAGCODE(ACLS),
FLAGCODE(ASYNC),
...

这很好用,现在我想添加一个检查,是否在不插入 #ifdef 的情况下定义了每个标志(例如 MNT_ACLS) >#endif 为每个符号 手动?

也就是说,我希望宏 FLAGCODE(name) 扩展为(相当于):

#ifdef MNT_ ##name
{ # name, MNT_ ##name },
#endif

Exempli gratia,如果nameNOATIME,代码应该变成:

#ifdef MNT_NOATIME
{ "NOATIME", MNT_NOATIME },
#endif

是的,我意识到,这将意味着双重通过预处理器,因此不太可能——如果没有自定义代码生成器……但仍然……

最佳答案

有一个解决方案,但强烈不推荐!你可以用 C 预处理器做一些有趣的事情(参见 Macro to replace nested for loops 和问题中的链接)。但我再说一遍:不要这样做。这是对 cpp 的滥用。

简而言之,您必须使用宏创建您自己的#ifdef。在下面的代码中,ISDEF 是一个“运算符”,用于检查标志是否已定义并且 #if 是否已被重新定义:IIF (要理解,所有解释都在这里:https://github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms)

#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define COMMA ,

#define IIF(c) PRIMITIVE_CAT(IIF_, c)
#define IIF_0(t, ...) __VA_ARGS__
#define IIF_1(t, ...) t

#define CHECK_N(x, n, ...) n
#define CHECK(...) CHECK_N(__VA_ARGS__, 0,)
#define PROBE(x) x, 1,

#define ISDEF(x) CHECK(PRIMITIVE_CAT(ISDEF_, x))
#define ISDEF_ PROBE(~)

#define FLAGCODE(name) IIF(ISDEF(name))({ #name COMMA MNT_ ## name }COMMA)

#define ACLS
#define FLAGDEFINED

int main()
{
struct {
const char *name;
uint64_t flag;
} flagcodes[] = {
FLAGCODE(ACLS)
FLAGCODE(ASYNC)
FLAGCODE(FLAGDEFINED)
FLAGCODE(FLAGNOTDEFINED)
...

你也可以用你的标志做一个列表(参见 http://jhnet.co.uk/articles/cpp_magic 中的 MAP 部分)。

享受预处理器,但不要过度使用它。

根据 Chris Dodd 的非常好的评论,
1:如果标志被定义为空(#define FLAGDEFINED),这个技巧就起作用了。它不适用于 #define FLAGDEFINED 1 或 #define FLAGDEFINED xxx。
2 : 增加了CPP_前缀,名称由CPP_FLAG改变

#define CPP_PRIMITIVE_CAT(CPP_a, ...) CPP_a ## __VA_ARGS__
#define CPP_COMMA ,

#define CPP_IIF(CPP_c) CPP_PRIMITIVE_CAT(CPP_IIF_, CPP_c)
#define CPP_IIF_0(CPP_t, ...) __VA_ARGS__
#define CPP_IIF_1(CPP_t, ...) CPP_t

#define CPP_CHECK_N(CPP_x, CPP_n, ...) CPP_n
#define CPP_CHECK(...) CPP_CHECK_N(__VA_ARGS__, 0,)
#define CPP_PROBE(CPP_x) CPP_x, 1,

#define CPP_ISDEF(CPP_x) CPP_CHECK(CPP_PRIMITIVE_CAT(CPP_ISDEF_, CPP_x))
#define CPP_ISDEF_ CPP_PROBE(~)

#define CPP_FLAGCODE(CPP_FLAG) CPP_IIF(CPP_ISDEF(CPP_FLAG))({ #CPP_FLAG CPP_COMMA MNT_ ## CPP_FLAG }CPP_COMMA)

#define ACLS
#define FLAGDEFINED

关于c - #ifdef 在#define 里面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66250435/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com