gpt4 book ai didi

c - MSVC : Error mapping a structure to an array of offsetof

转载 作者:行者123 更新时间:2023-11-30 16:42:06 24 4
gpt4 key购买 nike

我正在尝试使用结构字段的偏移量填充数组,我正在尝试执行以下操作

#define EXPAND_(X) X
#define TYPE_ARG_N(_0, _1, _2, N, ...) N
#define TYPE_OFFSET_1(S, _0) { sizeof(S), { offsetof(S, _0) } }
#define TYPE_OFFSET_2(S, _0, _1) { sizeof(S), { offsetof(S, _0), offsetof(S, _1) } }
#define TYPE_OFFSET_3(S, _0, _1, _2) { sizeof(S), { offsetof(S, _0), offsetof(S, _1), offsetof(S, _2) } }
#define TYPE_OFFSET_LIST() TYPE_OFFSET_3, TYPE_OFFSET_2, TYPE_OFFSET_1
#define TYPE_OFFSET_N_(...) EXPAND_(TYPE_ARG_N(__VA_ARGS__))
#define TYPE_OFFSET_ARGS(...) EXPAND_(__VA_ARGS__)
#define TYPE_OFFSET_SELECT(...) TYPE_OFFSET_N_(__VA_ARGS__, TYPE_OFFSET_LIST())
#define TYPE_OFFSET(S, ...) TYPE_OFFSET_SELECT(__VA_ARGS__)(S, TYPE_OFFSET_ARGS(__VA_ARGS__))

typedef struct {
size_t size;
size_t* offsets;
} tTable;

tTable t = TYPE_OFFSET(tTable, size, offsets);

MSVC2017 失败并出现以下错误:

error C4003: not enough actual parameters for macro 'TYPE_OFFSET_2'
error C2065: 'offsets': undeclared identifier
error C2102: '&' requires l-value

知道如何修复这些宏吗?

最佳答案

要调试此类内容,请尝试使用 /EP 标志通过预处理器运行内容。使用您的代码执行此操作会显示以下输出:

typedef struct {
size_t size;
size_t* offsets;
} tTable;

tTable t = fxma.h(17) : warning C4003: not enough actual parameters for macro 'TYPE_OFFSET_2'
{ sizeof(tTable), { offsetof(tTable, size, offsets), offsetof(tTable, ) } };

这里的问题是微软的预处理器有一个包含逗号的单个宏参数的概念。当逗号是由另一个宏的扩展产生的时,就会发生这种情况。

特别是,TYPE_OFFSET 使用 (tTable, size, offset) 调用 TYPE_OFFSET_2但是 size,offset 在一起(作为 TYPE_OFFSET_ARGS(__VA_ARGS__) 的扩展)实际上并不是两个不同的参数......它只是 1. TYPE_OFFSET_2 然后得到只有两个参数;换句话说:

  • StTable1
  • _0大小、偏移量
  • _1 缺失

(您可以在扩展中看到这一点;offsetof(tTable, size, offsets))。

修复方法是添加一个间接级别。将您的 TYPE_OFFSET 版本替换为:

#define TYPE_OFFSET_CALL(X, Y) X Y
#define TYPE_OFFSET(S, ...) TYPE_OFFSET_CALL(TYPE_OFFSET_SELECT(__VA_ARGS__),(S, TYPE_OFFSET_ARGS(__VA_ARGS__)))

关于c - MSVC : Error mapping a structure to an array of offsetof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46014465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com