Wie Barry erwähnt, Ihr Code ist nicht legal C++. Aber selbst wenn Sie den constexpr
Teil weggenommen haben, wäre es immer noch nicht legal C++. Ihr Code verletzt strenge Aliasing-Regeln und repräsentiert daher undefiniertes Verhalten.
Tatsächlich gibt es in C++ keine Möglichkeit, die Endian-Eigenschaft eines Objekts zu erkennen, ohne undefiniertes Verhalten aufzurufen. Casting es zu einem char*
funktioniert nicht, weil der Standard keine große oder kleine Endian-Reihenfolge erfordert. Während Sie also die Daten durch ein Byte lesen könnten, wären Sie nicht in der Lage, irgendetwas von diesem Wert abzuleiten.
Und geben Sie punning durch union
schlägt fehl, weil Sie nicht über in C++ schreiben überhaupt Wortspiel dürfen. Und selbst wenn Sie es wieder getan haben, beschränkt C++ Implementierungen nicht auf große oder kleine Endian-Reihenfolge.
Was also C++ als Standard betrifft, gibt es keine Möglichkeit, dies zu erkennen, sei es zur Kompilierzeit oder zur Laufzeit.
Gute Frage! Dies war ein Problem (andere Compiler für andere Sprachen) w.r.t. Gleitkommakonstanten/Ausdrücke und Kreuzkompilierer (damals noch, als es verschiedene Gleitkommaformate gab). Ich würde gerne die C++ Standardantwort kennen. – davidbak
Harte praktische Bedeutung. Ich kann mir zwei Architekturen nicht vorstellen, die dieselbe kompilierte Quelle ausführen können, sich aber in der Endianz unterscheiden. – SergeyA
@ πάντα ῥεῖ: Das ist nicht diese Frage überhaupt. Hier geht es um einen spezifischen Fall der Erkennung von Endian-Ness. –