我们在结构内存打包和对齐方面遇到问题。
Android 不支持 #pragma pack(push,
Android Clang 编译器需要在结构或类上使用 __ attribute __ 装饰器,例如:
struct __attribute__((packed, aligned(8))) Test
{
char a;
char b;
double d;
};
与 Visual C++ 不同的是,Visual C++ 遵循编译指示:
#pragma pack(push, 8)
struct Test
{
char a;
char b;
double d;
};
#pragma pack(pop)
由于 #pragma pack 的使用如此广泛,修复它将是一项耗时的任务。
我们尝试使用 -mms-bitfields 编译器标志,该标志将默认结构布局设置为与 Microsoft 编译器标准兼容(即,它遵循 #pragma pack)。然而,这仅适用于简单的结构,不适用于具有基类或虚函数的类。对于这些类型的类,我们收到以下错误。
“错误:ms_struct 可能无法为具有基类或虚拟函数的类生成与 Microsoft 兼容的布局 [-Win兼容-ms-struct]”
我们如何缓解这个问题 - 除了检查push和pop pragmas之间的所有类/结构并添加packed属性之外,是否有任何解决方法可以使#pragma pack适用于重要的结构/类?
谢谢
最佳答案
首先,我的印象是,当您的代码中有“数百个位置”时,您正在做一些根本上错误的事情,您需要在其中定义对齐以防止段错误。该编译指示是非标准的,并且没有广泛使用。最值得注意的是,它并不像您那样广泛使用。它也不在标准中。
无论如何,由于 clang 会忽略编译指示,而 msvcc 会忽略属性,因此我会将两者都放入代码中。您可能会使用例如grep
和 sed
来避免大量的手动工作。
关于android - Clang 和 Visual C++ 结构对齐兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40756694/