加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中初始化结构中的const数组

发布时间:2020-12-16 09:42:17 所属栏目:百科 来源:网络整理
导读:我必须在道具上工作.二进制文件格式,并希望使用结构来实现它. 我需要在我的结构中使用恒定的字节序列,并且我不知道如何实现它. 我想到了类似的东西: #include cstdint#pragma pack(push,1)typedef struct PAYLOAD_INFO { const uint8_t magicnumber[4] = {
我必须在道具上工作.二进制文件格式,并希望使用结构来实现它.
我需要在我的结构中使用恒定的字节序列,并且我不知道如何实现它.

我想到了类似的东西:

#include <cstdint>
#pragma pack(push,1)

typedef struct PAYLOAD_INFO {
    const uint8_t magicnumber[4] =  { 0xFA,0x11,0x28,0x33 };
    uint16_t UMID;
    const uint16_t VID = 1487 ;
    uint32_t crc;
};

#pragma pack(pop)

int main (){
  PAYLOAD_INFO pldInst;
  pldInst.UMID = 5;
  pldInst.crc = 0x34235a54;
  ...
  writeToFile(&PAYLOAD_INFO,sizeof(PAYLOAD_INFO));
}

最后,“pldInst”应该看起来像(在内存中),而不考虑此示例中的byteorder:

0x00000000:  0xFA,0x33
0x00000004:  0x00,0x05,0xCF
0x00000008:  0x34,0x23,0x5a,0x54

我已经尝试过“默认”方法:

#include <cstdint>
#pragma pack(push,1)

typedef struct PAYLOAD_INFO {
    static const uint8_t magicnumber[4];
    uint16_t UMID;
    static const uint16_t VID = 1487 ;
    uint32_t crc;
};

const uint8_t magicnumber[4] =  { 0xFA,0x33 };

#pragma pack(pop)

但不能按预期工作.

有没有办法在不计算每个结构成员的内存大小,分配新内存和复制每个成员的情况下完成此操作?

我使用g 4.6.3.

看待,
托马斯

更新:
@bikeshedder提供的c 11解决方案效果很好,但只能用g 4.7或更高版本编译.

解决方法

我建议不要将任何类型的结构转换为原始内存,除非你使用的是一些内核接口,它保证在同一台机器上运行并且应该以这种方式使用.

这不是可移植的(endian问题),每个编译器都有一点不同,性能确实不是那么好.总而言之,这并不能证明这种不良做法.

您的代码示例不起作用的原因是静态成员.由于静态成员不是对象(但是类)的一部分,因此只有UMID和crc以这种方式编写.

struct PAYLOAD_INFO {
    const uint8_t magicnumber[4] = { 0xFA,0x33 };
    uint16_t UMID;
    const uint16_t VID = 1487 ;
    uint32_t crc;
};

此代码仅适用于C 11,但由于您包含cstdint,我假设您已经使用该C版本.如果不使用C 11,则需要在构造函数中初始化成员,并且不能将const用于幻数,因为它无法初始化. (见:initialize a const array in a class initializer in C++)

struct PAYLOAD_INFO {
    const uint8_t magicnumber[4] = { 0xFA,0x33 };
    uint16_t UMID;
    const uint16_t VID = 1487 ;
    uint32_t crc;
};

对于C 98,您需要:

struct PAYLOAD_INFO {
    uint8_t magicnumber[4];
    uint16_t UMID;
    const uint16_t VID;
    uint32_t crc;
    PAYLOAD_INFO() : VID(1487)
    {
        magicnumber[0] = 0xFA;
        magicnumber[1] = 0x11;
        magicnumber[2] = 0x28;
        magicnumber[3] = 0x33;
    }
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读