C预处理器: declare structure data from a given enum value

标签 c enums preprocessor

我正在尝试从枚举值自动声明给定的数据结构。一个简单的例子胜过千言万语:

#define X_FIELDS \
    X(A, upd_foo) \
    X(B, upd_bar)

enum MSGS_TYPES {
#define X(msg_type, data_type) msg_type,
    X_FIELDS
#undef X
    MSGS_SIZE
};

#define DECLARE_MSG(name, type)           X(type) name = { type };  

typedef struct {
    enum MSGS_TYPES type;
    int x;
} upd_foo;

typedef struct {
    enum MSGS_TYPES type;
    int y;
} upd_bar;

int main() {
    DECLARE_MSG(msg, B);     
    printf("%d\n", msg.type);
    msg.y = 0;
    return 0;
}

在这里,我想为 DECLARE_MSG 宏声明
upd_bar msg = { B };
有什么办法可以实现吗?

请注意,我已经尝试过类似的方法:

#define T_A    upd_foo
#define T_B    upd_bar

#define _T(type)  T_type
#define X(type)   _T(type)
#define DECLARE_MSG(name, type)           X(type) name = { type };  

但它显然不起作用,提示'T_type'是一个未知的类型名称。

非常感谢!

最佳答案

T_type 被认为是单个标记,type 参数在宏扩展中找不到。

您需要使用连接运算符##:

#define _T(type)  T_##type

关于C预处理器: declare structure data from a given enum value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57655670/

相关文章:

c - 汇编 - 如何找到一个函数为自己分配了多少堆栈空间

c - Lua:getglobal内部回调

java - 在针对枚举 Java 中的每个项目检查输入后如何跳出循环?

preprocessor - 定义CLion分析仪的预处理器符号

c - 使用来自多个文件的信号量 C-Windows

c - size_t foo = 0;需要类型转换吗?

java - 如何通过反射获取内部类中存在的枚举的值

reactjs - react 和 typescript : Constant enums and namespaces are not supported

lua - 我的 Lua DSL 能用吗...? (这似乎太简单了,不可能是真的)

c++ - 如何在整个编译过程中遵循预处理器指令