所以我有一个查询,说我有一个像这样的枚举和结构,
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/