将枚举字符串(不是值)传递给宏
Passing an enum string (not value) to a macro
我有这个查询其中我有一个枚举和一个结构体,像这样,
enum fields {
field_1,
field_2
};
struct my_struct {
int field_1;
int field_2;
};
我的具体需要是,给定具有结构成员(field_1, field_2等)名称的enum,我应该能够生成一个宏,该宏可以将结构成员设置为给定值。
#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宏帮助我提取枚举成员作为字符串(如何将枚举类型变量转换为字符串?)。问题是如何以适当的方式将其传递给宏。
应该是这样的。宏在编译之前被处理,而代码仍然是代码,它们导致代码生成。
宏#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("%dn", div_by_100(1000)); // will print 10
printf("%dn", 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;
}
}
这取决于将enum转换为string的机制。只要该机制仍然是一个被预处理器取代的宏,您的宏就应该工作。这就是问题所在。否则你的宏应该能正常工作。
相关文章:
- 重载 std::字符串运算符+ 用于打印枚举名称
- 给枚举一个整数,并在 C++ 中将其相关值作为字符串获取
- 重载输入 (>>) 运算符以获取枚举字符串
- C++如何将字符串数组中的一个点设置为枚举变量
- 将整数值转换为以枚举为基础的字符串
- 将 Qt 属性枚举值打印为键字符串
- 如何在没有映射的情况下在枚举和字符串之间进行转换?
- 是否有任何操纵器将枚举值打印为字符串?
- C 中的枚举类型字符串类别
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 失败的证明转换字符串到枚举类
- 使用 C++11 可变参数模板初始化枚举到字符串映射
- C++将多个字符串更改为枚举
- 从字符串转换时,如何组合多个枚举
- 翻译枚举值qt的字符串表示
- 如何重载<<以输出枚举的字符串值
- 在 QML 中使用 c++ 枚举作为字符串
- 使用地图将字符串与枚举连接
- 具有字符串的类中的枚举
- 将枚举字符串(不是值)传递给宏