c++ - C 中的结构封装

标签 c++ c structure qt-creator

我有一个结构:

**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 ;
};

标准保证默认情况下不会应用填充!
你应该确定一件事。结构体的开头不会有任何填充,之后默认情况下您就可以自己使用了。

关于c++ - C 中的结构封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18239740/

相关文章:

c - 使用socket进行文件传输和修改

c++ - 如何在C++中将excel数据加载到数组中

c++ - ncurses:奇怪的行格式

c++ - 编译器在处理 volatile 内存位置时必须遵循哪些规则?

c++ - 修复 "disconnected"Windows 驱动器映射

c - K&R 练习 1-9 (C)

c - 在指针数组中放置一个区间

c - C中不同定义的同名结构

c - 在 C 中将一个变量分配给 union 中的另一个变量

c++ - 使用 maven-nar-plugin 在 Maven 中构建 C++ 项目