Ich habe eine vordefinierte Struktur (eigentlich mehrere), in der sich Variablen über die 32-Bit-Wortgrenze erstrecken. In Linux (und Windows mit GCC) bin ich in der Lage, meine Strukturen mit 'Attribut ((gepackt))' in die richtige Größe zu packen. Allerdings kann ich es nicht mit VC ++ und #pragma pack auf die gleiche Weise arbeiten.
Unter Verwendung von GCC gibt dies eine korrekte Größe von 6 Bytes zurück:
%Vor%Bei Verwendung von VC ++ wird eine falsche Größe von 8 Byte zurückgegeben
%Vor%Ich kann Dinge erledigen, indem ich "troubleMaker" manuell über die Grenze spalte, aber das möchte ich lieber nicht. Irgendwelche Ideen?
Ich würde vorschlagen, keine herstellerspezifischen C-Spracherweiterungen zu verwenden, um Geräte- oder Netzwerk-Bit-Formate abzugleichen. Selbst wenn Sie die Felder mithilfe einer Reihe von Spracherweiterungen pro Anbieter ausrichten, müssen Sie sich immer noch um die Byte-Reihenfolge kümmern, und Sie müssen immer noch über ein Strukturlayout verfügen, für das zusätzliche Anweisungen erforderlich sind.
Sie können ein C99-konformes Programm schreiben, das auf jeder Architektur oder jedem Host mit maximaler Geschwindigkeit und Cache-Effizienz arbeitet, indem die standardisierten C-API-String- und Speicherkopiefunktionen und die Posix-Hton- und -Ntoh-Funktionen verwendet werden.
Eine gute Vorgehensweise besteht darin, die folgenden Funktionen zu verwenden, für die es veröffentlichte Standards gibt:
%Vor% Update: Hier ist ein Code, der überall gleich funktionieren sollte. Möglicherweise müssen Sie <stdint.h>
von diesem Projekt herunterladen, wenn Microsoft noch lautet 't es für C99 implementiert, oder einfach die üblichen Annahmen über int-Größen machen.
Ausrichtung und Reihenfolge von Bitfeldern sind notorisch implementierungsspezifisch. Es ist viel sicherer, ein normales ganzzahliges Feld zu deklarieren und die "Bitfelder" innerhalb von Masken und bitweisen (| & amp; ^) Operatoren zu manipulieren.
Ich glaube, VC ++ unterstützt das nicht, und ich habe ernsthafte Zweifel, ob das Verhalten des GCC in dieser Hinsicht tatsächlich Standard ist.
Tags und Links memory c++ gcc visual-c++