android - Clang 和 Visual C++ 结构对齐兼容性问题

标签 android c++ visual-c++ struct clang

我们在结构内存打包和对齐方面遇到问题。

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 会忽略属性,因此我会将两者都放入代码中。您可能会使用例如grepsed 来避免大量的手动工作。

关于android - Clang 和 Visual C++ 结构对齐兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40756694/

相关文章:

C++ 使用 while 循环检查输入值

c++ - 在程序中显示静态 C++ 对象的初始化顺序?

C++11 从相同类类型的构造函数调用构造函数

android - 无法配置 travis 以在 android 项目上工作

c++ - 使用线程对数组的两半进行排序,但仅对后半部分进行排序

android - 关于使用 gradle 或 android studio 进行 Android 单元测试的问题

c++ - 在 C++ 控制台应用程序中打印字符串资源(字符串表)

visual-c++ - 如何判断一个 Visual Studio 项目文件是代表应用程序、DLL 还是静态库项目?

android - 添加不带 XML 的 AdMob 横幅

Android 源代码、Git/Repo 和错误 : '.../.repo/repo/.git/clone.bundle' does not look like a v2 bundle file