【发布时间】:2021-02-05 16:22:38
【问题描述】:
是否可以在编译时计算结构中所需的填充数组的大小,以使结构最终成为每个确定的大小。那就是我想做这样的事情(我知道这行不通)
#define APPDESCTARGETSIZE 256 // Target size for the App Desc Structure
// Structure member size of
#define msizeof(type, member) sizeof(((type *)0)->member)
// Size of padding arrary
#define padsize (APPDESCTARGETSIZE - (offsetof(custom_app_desc_t, pad) + msizeof(custom_app_desc_t, tail)))
/** * @brief Description about application. */
typedef struct {
uint8_t header[16];
char progname[16];
char boardname[16];
uint8_t chipsize;
uint8_t version_maj;
uint8_t version_min;
uint8_t version_iss;
uint8_t pad[padsize];
uint8_t tail[16];
} custom_app_desc_t;
我可以通过如下的手动计算来解决,但编译器为我做数学会很好:
#define padsize (APPDESCTARGETSIZE - 68)
注意,在这种情况下,重要的是 pad 出现在 'tail' 成员之前。
【问题讨论】:
-
您应该决定是在 C(基于宏的解决方案)还是 C++(基于模板和 constexpr 的解决方案)中执行此操作
-
您想使用/访问
pad字段吗?请edit回答您的问题。也许你可以使用联合。 -
假设 C 和宏等
-
您会收到如下错误:lib\RR_OTA_Update\src/custAppDesc.h:46:73: 错误:“struct custom_app_desc_t”没有名为“pad”的成员 const size_t padsize = (APPDESCTARGETSIZE - offsetof (custom_app_desc_t, pad) + msizeof(custom_app_desc_t, tail));
-
@KamilCuk :你能说明在哪里使用 offsetof() 吗?我在尝试中遇到了上述编译器错误。因为结构没有在定义之前声明。因此捕获 22 !!