我正在对 LCD 日立显示器并行端口连接进行建模(对于那些感兴趣的 HD44780,采用 4 位模式)。
即使对齐设置为1,这个 union 仍然占用2个字节。如果我去掉 msnibble 结构(直接将 db4 到 db7 放在 union 结构中),它会占用 1 个字节。如果结构位于 union 内,它们可以占用少于 1 个字节吗? 2 个字节是否是 msnibble 占用 1 个字节加上半字节(使能位、rs 位和两个空白位)的结果,从而使大小为 2 个字节?
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t byte_t;//could have used char
#pragma pack(push,1)
typedef union
{
byte_t whole_port :8;
struct
{
byte_t enable :1;
byte_t rs :1;
byte_t :1;
byte_t :1;
struct
{
byte_t db4 :1;
byte_t db5 :1;
byte_t db6 :1;
byte_t db7 :1;
}msnibble;
};
} para_port_t;
#pragma pack(pop)
int main(int argc, char** argv) {
printf("%u\n",sizeof(para_port_t));
return (EXIT_SUCCESS);
}
我正在 ubuntu 中的 netbeans 中使用 gcc 进行编译。由于 pragma 是一个编译器指令,我想知道它在 Microsoft Visual Studio 中是否相同?
最佳答案
您的最后一个问题询问 MSVC 是否有 2 个字节用于 union :是的。
您的 union 有一个变体,即嵌套在 struct
中的 struct
。怎么可能是1个字节呢?没有 union ,
#pragma pack(push,1)
typedef struct {
byte_t enable :1;
byte_t rs :1;
byte_t :1;
byte_t :1;
struct
{
byte_t db4 :1;
byte_t db5 :1;
byte_t db6 :1;
byte_t db7 :1;
}msnibble;
} thatstruct;
#pragma pack(pop)
大小为 2。哪里说嵌套结构可以打包为 1 个字节?
关于c - 为什么这个 Union 占用 2 个字节,即使我对齐到 1 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443477/