所以我有一个查询,说我有一个像这样的枚举和结构,

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/

10-14 10:57
查看更多