Clang和Visual C 结构兼容性问题

Clang and Visual C++ struct alignment compatibility issues

本文关键字:兼容性 问题 结构 Visual Clang      更新时间:2023-10-16

我们有一个问题结构内存包装和对齐。

Android并未兑现#pragma Pack(Push,< n>),该包在我们的代码库中数百个位置。这是原因。

Android clang编译器需要__属性__装饰器在结构或类上,例如:

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

与视觉C 相反,尊敬的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适用于非平凡的结构/类工作?p>谢谢

首先,我有这样的印象,当您在代码中拥有"数百个占位"时,您的做法从根本上是错误的,您需要定义对齐方式以防止segfault。这个布拉格是非标准的,并且使用它并不普遍。最值得注意的是,像您一样广泛使用它并不普遍。它也不是标准。

无论如何,由于Clang会忽略Pragma,而MSVCC会忽略这些属性,因此我将两者都放在代码中。您可能会使用例如grepsed可防止大量手动工作。