有没有人遇到过__attribute((packed))
不能被windows平台上的gcc编译器识别的情况?GCC版本6.3.0
typedef unsigned int u32;
typedef int s32;
typedef unsigned short u16;
typedef short s16;
typedef unsigned char u8;
typedef char s8;
typedef struct{
u16 limit;
u32 base;
}__attribute__ ((packed)) gdt_register_t;
对于__attribute__ ((packed))
,gdt_register_t
的大小应该是6
,但在我的环境中,它是8
,我认为问题是__attribute__ ((packed))
不起作用。
有人建议我使用标准的固定大小uint16_t、uint32_t,但结果仍然是8
。
#include <stdio.h>
#include <stdint.h>
typedef unsigned int u32;
typedef int s32;
typedef unsigned short u16;
typedef short s16;
typedef unsigned char u8;
typedef char s8;
typedef struct{
u16 limit;
u32 base;
}__attribute__ ((packed)) gdt_register_t;
size_t bar(void)
{
return sizeof(gdt_register_t);
}
typedef struct{
uint16_t limit;
uint32_t base;
}__attribute__ ((packed)) gdt_register_t1;
size_t bar1(void)
{
return sizeof(gdt_register_t1);
}
看起来我不应该轻易使用gcc -c abc.c
来编译文件,需要一些其他的参数吗?
1条答案
按热度按时间jgovgodb1#
这可能不是你的主要问题,但这是一个如此重要的事情,我认为它需要得到妥善解决。
您正在使用:
这在很多层面上都是错误的。一个
int
并不保证是32位的。它实际上甚至不保证至少是32位的。你不仅做出了一个虚假的承诺,这可能是未来bug的根源,你也跳过了为此目的而存在的类型。永远不要使用那个typedef。如果你想要一个32位的有符号整数,那么就使用
int32_t
。如果你真的想要,你也可以使用int_fast32_t
和int_least32_t
,但这些都不是很常见。也有无符号的版本和其他大小的。除此之外,我不知道为什么它给你的大小为8。我尝试了你的代码,得到的结果是6。https://onlinegdb.com/2bCZM7AUZ
我想你可以尝试使用
__attribute__((packed, aligned(X)))
,其中X
是对齐方式。尝试将其设置为1或2。