Wir haben ein Problem beim Strukturspeicher und Ausrichtung.Clang und Visual C++ - Struct Alignment Kompatibilitätsprobleme
Android ist nicht die # pragma pack (push, <n>), die in mehreren hundert Orten in unserer Code-Basis ist. Dies verursacht einen segfault.
Der Android Clang-Compiler erfordert ein __ Attribut __ Dekorateur auf der Struktur oder Klasse, zum Beispiel:
struct __attribute__((packed, aligned(8))) Test
{
char a;
char b;
double d;
};
Wie für Visual C++ zu diesem Gegensatz, der die Pragma ehrt:
#pragma pack(push, 8)
struct Test
{
char a;
char b;
double d;
};
#pragma pack(pop)
Seit die Verwendung von #pragma pack ist so weit verbreitet, dass es eine zeitraubende Aufgabe ist, dies zu beheben.
Wir haben versucht, das Compiler-Flag -mms-bitfields zu verwenden, das das Standardstrukturlayout so einstellt, dass es mit dem Compilerstandard von Microsoft kompatibel ist (d. H. Es berücksichtigt das Paket #pragma). Dies funktioniert jedoch nur für triviale Strukturen und nicht für Klassen mit Basisklassen oder virtuellen Funktionen. Wir erhalten den folgenden Fehler mit dieser Art von Klassen.
„Fehler: ms_struct kann nicht Microsoft-kompatible Layouts für Klassen mit Basisklassen oder virtuellen Funktionen erzeugt [-Wincompatible-ms-Struktur]“
Wie können wir dieses Problem mildern - gibt es eine Abhilfe # machen Pragma Pack funktioniert für nicht-triviale Strukturen/Klassen anders als über alle Klassen/Strukturen zwischen Push- und Pop-Pragmas zu gehen und das gepackte Attribut hinzuzufügen?
Dank
Es ist eine sehr lange lebende Code-Basis, also denke ich, dass Dinge wie das passieren werden, und yeah, ich habe grep/sed oder ein dediziertes Skript gesammelt, ist wahrscheinlich der Weg zu gehen. Danke, mal sehen, ob jemand anderes auf ein solches Problem gestoßen ist und vielleicht einen anderen Vorschlag hat. –