我有一个结构:

**struct PROCESSING
{
    PROCESSOR Byte ;
    uint16_t count ;
    uint8_t overrange ;
    Status status ;
    Time timestamp ;
    float Field;
    float temperature ;
    float adc1;
    float dac1;
    float Field2;
    float Temperature;
    float adc2 ;
    float dac2 ;
};
PTC_STATIC_ASSERT_SIZE(Processing, 45U);**


该结构的实际结构为45U,但是在构建时出现错误:
“将sizeof无效地应用于不完整的类型”

我需要将其打包到恰好45U。

最佳答案

关于结构包装:

为了避免对齐和填充问题,您应该考虑。


重新排列成员。
自己添加填充。
告诉编译器将每个成员的边界更改为1个字节。


例如:

#pragma pack(push)
#pragma pack(1)
struct PROCESSING
{
    PROCESSOR Byte ;
    uint16_t count ;
    uint8_t overrange ;
    Status status ;
    Time timestamp ;
    float Field;
    float temperature ;
    float adc1;
    float dac1;
    float Field2;
    float Temperature;
    float adc2 ;
    float dac2 ;
};
#pragma pack(pop)


重新对齐以防止填充。

struct PROCESSING
{
    PROCESSOR Byte ; // 1 byte
    Status status ;  // 1 byte
    char __padding[2]; // 2 bytes

    uint16_t count ;   // 2 byte
    uint8_t overrange ; // 1 byte
    char _padding;      // 1 byte

    Time timestamp ; // 8 bytes

    float Field;
    float temperature ;
    float adc1;
    float dac1;
    float Field2;
    float Temperature;
    float adc2 ;
    float dac2 ;
};


该标准不保证默认情况下不应用填充!
您应该确定一件事。在结构的开始处将没有任何填充,在那之后,您将自己运行-默认情况下-。

10-08 06:55
查看更多