gpt4 book ai didi

c++ - 将枚举字符串(不是值)传递给宏

转载 作者:行者123 更新时间:2023-11-28 06:10:49 26 4
gpt4 key购买 nike

所以我有这个查询,其中说我有一个枚举和一个看起来像这样的结构,

enum fields {
field_1,
field_2
};

struct my_struct {
int field_1;
int field_2;
};

我的具体需要是,给定具有结构成员名称(field_1、field_2 等)的枚举,我应该能够生成一个可以将结构成员设置为给定值的宏。

#define my_macro (__a, __field) \
__a.__field = 1;

那么有没有办法像这样调用my_macro:

struct my_struct b;
/* extract members of enum as string literals */
my_macro(b, /*field name from the enum */);

很少有其他详细介绍 boost 宏用法的帖子可以帮助我将枚举成员提取为字符串 (How to convert an enum type variable to a string?)。问题在于以适当的方式将其传递给宏。

最佳答案

它应该按原样工作。宏在编译之前被处理,而代码仍然是代码,它们导致代码生成。

你的宏 #define my_macro(__a, __field) __a.__field = 1; 会导致像 my_macro(x, y) 这样的条目被转换成 x.y = 1;,从字面上看,在它交给编译器之前。

如果您执行类似 my_macro(1+1, "test") 的操作,它将生成代码 1+1."test"= 1; 并将创建一个编译错误。这就是宏的简单之处。

这就是为什么宏参数通常包含在 () 中以确保它按预期方式工作,如果您不这样做,可能会发生这样的事情:

#define div_by_100(a) a / 100

printf("%d\n", div_by_100(1000)); // will print 10
printf("%d\n", div_by_100(500 + 500)); // will print 505

发生这种情况是因为操作顺序是在编译时解决的,在宏被解析之后。

请注意,因为宏是在编译前解析的,所以它们不是运行时解决方案。如果此 enum 值在代码中不明确,则宏根本帮不了您。您将必须编写一个路由函数,该函数将根据给定的 enum 值为此类/结构的每个成员分配一个值。示例:

void route(struct farm* s, enum animals e)
{
switch (e)
{
case cow:
s->cow = 1;
break;
case duck:
s->duck = 1;
break;
case horse:
s->horse = 1;
break;
case goat:
s->goat = 1;
break;
}
}

关于c++ - 将枚举字符串(不是值)传递给宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31306461/

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