C 预处理器:从给定的枚举值声明结构数据

C preprocessor: declare structure data from a given enum value

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

#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