首页 > 解决方案 > 如何定义可变参数宏来初始化联合?

问题描述

我想定义很多这样的联合:

union {
  float a;
  float b;
  float c;  // there can be many variables
} a;

我不想让代码太大

所以我想定义一个宏来解决这个问题。

理想的宏如下所示:

#define U(real_name, ...)/
union {\
....

我只需要一行来定义:

U(a, b, c, d)

但我不知道如何从中获取可变参数...,你能帮忙吗?

标签: c++macrosunions

解决方案


尝试这个:

#define SIZEOF_VA_ARGS(...) SIZEOF_VA_ARGS_(__VA_ARGS__, 5, 4, 3, 2, 1, 0)
#define SIZEOF_VA_ARGS_(_1, _2, _3, _4, _5, N, ...) N

#define U_1(type, memb)      type memb
#define U_2(type, memb, ...) type memb; U_1(type, __VA_ARGS__)
#define U_3(type, memb, ...) type memb; U_2(type, __VA_ARGS__)
#define U_4(type, memb, ...) type memb; U_3(type, __VA_ARGS__)
#define U_5(type, memb, ...) type memb; U_4(type, __VA_ARGS__)

#define CONCAT(a, b)  a##b
#define U_(N, type, ...) CONCAT(U_, N)(type, __VA_ARGS__)

#define U(...) \
    union { U_(SIZEOF_VA_ARGS(__VA_ARGS__), float, __VA_ARGS__); }
U(a, b, c, d) foo;
// or
using mytype = U(a, b, c, d);
mytype foo;

注意上面的代码最多只支持五个成员,所以如果你想使用五个以上的成员,你需要定义U_6, , ..., 并在/U_7的定义中插入数字。SIZEOF_VA_ARGSSIZEOF_VA_ARGS_


推荐阅读