为什么使用gcc时,Linux和Windows上的打包结构的大小会有所不同?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (34)

在下面的代码中,为什么使用gcc编译时,Linux和Windows上打包结构的大小不同?

#include <inttypes.h>
#include <cstdio>

// id3 header from an mp3 file
struct header
{    
        uint8_t version[ 2 ];
        uint8_t flags;
        uint32_t size;
} __attribute__((packed));

int main( int argc, char **argv )
{
        printf( "%u\n", (unsigned int)sizeof( header ) );
        return 0;
}

使用的gcc版本:

$ g++ --version
g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
$ x86_64-w64-mingw32-g++ --version
x86_64-w64-mingw32-g++ (GCC) 4.7.0 20110831 (experimental)

编译和测试:

$ g++ -Wall packed.cpp -o packed && ./packed
7
$ x86_64-w64-mingw32-g++ -Wall packed.cpp -o packed.exe
--> prints '8' when run on Windows.
提问于
用户回答回答于

gcc属性的6.37.3节将其解释为ABI规范的差异,请参阅:http ://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html

用户回答回答于

gcc 4.7.0这样做是为了与64位MSVC ++兼容。如果你想正确打包结构,请使用-mno-ms-bitfields

扫码关注云+社区

领取腾讯云代金券