我正在为LCD hitachi显示器并行端口连接建模(对于那些感兴趣的HD44780,在4位模式下)。
即使对齐设置为1,此联合仍占用2个字节。如果我摆脱了msnibble结构(直接将db4放到了union中的结构中的db7),它占用了1个字节。如果它们在一个联合内部,那么结构会占用不到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);
}
我正在使用gcc编译ubuntu中的netbeans。由于pragma是一个编译器指令,我想知道它是否在Microsoft Visual Studio中是相同的?
答案 0 :(得分:0)
你的最后一个问题询问MSVC是否有2个字节用于联合:是的。
您的联盟有一个struct
变体嵌套在struct
中。怎么可能是1个字节?没有工会,
#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个字节?
答案 1 :(得分:-1)
如果结构在联盟内部可以占用不到1个字节吗?
不。嵌套的struct
占用一个完整的字节,外部的struct
最多占两个字节。