C++ 是否可以将C/C++;使用编译时计算将结构设置为固定大小?

C++ 是否可以将C/C++;使用编译时计算将结构设置为固定大小?,c++,c,C++,C,是否可以在编译时计算结构中所需的填充数组的大小,从而使结构最终成为每确定大小的填充数组。那就是我想做这样的事情(我知道这行不通) 我可以通过如下的手动计算来解决问题,但编译器最好能帮我做数学运算: #define padsize (APPDESCTARGETSIZE - 68) 注意,在这种情况下,pad出现在“tail”成员之前非常重要。解决这一问题的一种方法是使用联合: struct { union { struct { // thi

是否可以在编译时计算结构中所需的填充数组的大小,从而使结构最终成为每确定大小的填充数组。那就是我想做这样的事情(我知道这行不通)

我可以通过如下的手动计算来解决问题,但编译器最好能帮我做数学运算:

#define padsize     (APPDESCTARGETSIZE - 68)

注意,在这种情况下,pad出现在“tail”成员之前非常重要。

解决这一问题的一种方法是使用
联合:

struct {
    union {
        struct {
            // this is your structure, without the last element
        };
        char _reserved[APPDESCTARGETSIZE - 16]; // exclude the last tail element
    };
    char tail[16]; // the tail is outside of the padding
};

IMO中最简单的方法是封装到另一个结构中

#define APPDESCTARGETSIZE       256  
#define TAILSIZE    16
#define TAILTYPE    uint8_t

typedef struct {
    struct internal{
        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;
    }fields;
    uint8_t   pad[APPDESCTARGETSIZE - sizeof(struct internal) - sizeof(TAILTYPE) * TAILSIZE];
    TAILTYPE   tail[TAILSIZE]; 
 } custom_app_desc_t;
或者是盲目的(但使用匿名结构)


使用未命名的联合成员和结构成员,可以根据需要控制布局:

#define APPDESCTARGETSIZE  256    // Target size for the App Desc Structure

/**  * @brief Description about application.  */ 
typedef struct {
    union {
        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   pad0[APPDESCTARGETSIZE - 16];
    };
    uint8_t   tail[16]; 
} custom_app_desc_t;
您可以像访问自定义应用程序描述的成员一样访问这些成员:

    custom_app_desc_t obj;
    get_app_desc(&obj);
    printf("progname: %s\n", obj.progname);
这种简便的语法技巧称为匿名联合和匿名结构

匿名联合的大小是其每个成员大小中的最大值,即:包含命名成员的结构和字节数组
pad0
。 由于命名成员的大小小于
APPDESCTARGETSIZE-16
字节,因此联合大小正好是
APPDESCTARGETSIZE-16
,这是本练习的目标

如果需要访问填充字节,可以在内部结构的末尾添加一个额外的成员
uint8_t pad[1]


如果<代码>尾部>代码>部分不是简单的字节数组,则需要为其定义结构类型并减去其大小而不是16。< / P>您应该决定是否要在C(基于宏的解决方案)或C++(基于模板和CONTXPR)的方案中实现这一点?您想使用/访问<代码> PAD < /Cord>字段吗?请回答你的问题。也许你可以使用一个联合。让我们假设C和宏等你得到如下错误:lib\RR_OTA_Update\src/custAppDesc.h:46:73:error:“struct custom_app_desc_t”没有名为“pad”的成员const size_t padsize=(APPDESCTARGETSIZE-offsetof(custom_app_desc_,pad)+msizeof(custom_app_desc,tail))@卡米尔库克:你能告诉我在哪里使用offsetof()吗?我在尝试中遇到了上述编译器错误。因为在定义之前没有声明结构。这就是第22条!!你能解释一下为什么最后一个元素不包含在联合体中吗?你可以不使用内部结构的名称,这样就可以直接访问其成员。联合体的右大括号后缺少分号。

\u data
不包含在内needed@TanveerBadar:这样它就在填充之后,正如问题中所要求的那样。@0\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo:oops,我误读了规范。现在已修复。如果我想要某种通用解决方案,我不会使用硬编码16。
#define APPDESCTARGETSIZE  256    // Target size for the App Desc Structure

/**  * @brief Description about application.  */ 
typedef struct {
    union {
        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   pad0[APPDESCTARGETSIZE - 16];
    };
    uint8_t   tail[16]; 
} custom_app_desc_t;
    custom_app_desc_t obj;
    get_app_desc(&obj);
    printf("progname: %s\n", obj.progname);