c++ - 如何定义可变参数宏来初始化联合?
问题描述
我想定义很多这样的联合:
union {
float a;
float b;
float c; // there can be many variables
} a;
我不想让代码太大
所以我想定义一个宏来解决这个问题。
理想的宏如下所示:
#define U(real_name, ...)/
union {\
....
我只需要一行来定义:
U(a, b, c, d)
但我不知道如何从中获取可变参数...
,你能帮忙吗?
解决方案
尝试这个:
#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_ARGS
SIZEOF_VA_ARGS_
推荐阅读
- amazon-dynamodb - 使用全局二级索引从 Dynamo DB 查询数据
- asp.net - 如何使用 asp.net Web Api 中的表单数据在 API 中对对象上传进行建模
- javascript - 为什么即使在反应中调用 e.nativeEvent.stopPropagation 后事件也会传播到父级?
- flutter - 如何在颤动的垂直列表视图中创建水平列表视图
- java - 可搜索微调器
- python - 如何在 zip 中添加文件并使用 python 将其删除?
- ios - NSPredicate 调用关系
- javascript - 我在 angular:src/app/app.component.html:18:20 上收到此错误 - 错误 TS2339:“AppComponent”类型上不存在属性“DepScreen”
- python - Python SpeechRecognition 库说我的麦克风不可用
- python - clickhouse 有内存泄漏问题吗?