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

时间:2016-11-23 05:27:11

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

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

Android并未尊重#pragma pack(push,< n>),它在我们的代码库中已有数百个位置。这是导致段错误的原因。

Android Clang编译器在结构或类上需要__ attribute __ decorator,例如:

struct __attribute__((packed, aligned(8))) Test
{
    char a;
    char b;
    double d;
};

与支持pragma的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兼容的布局[-Wincompatible-ms-struct]”

我们如何缓解这个问题 - 是否有任何解决方法使#pragma pack适用于非平凡的结构/类,而不是遍历push和pop pragma之间的所有类/结构并添加packed属性?

由于

1 个答案:

答案 0 :(得分:2)

首先,我的印象是,当你的代码中有“几百个地方”时,你正在做一些根本错误的事情,你需要定义对齐以防止出现段错误。该pragma是非标准的,并且使用它并不普遍。最值得注意的是,使用它并不像你那样广泛使用。它也不符合标准。

无论如何,因为clang会忽略pragma而msvcc会忽略这些属性,所以我将两者放在代码中。您可以使用例如grepsed以防止大量手动工作。