Host-byte-order zur Compilezeit bestimmen?
-
Nochmal zur Big-/Little-Endian Problematik (Host byte order):
Is ja kein Problem das mit C++ zur Laufzeit zu bestimmen, aber hat eventuell jemand ne schlaue Idee um das zur Compile-Zeit zu bestimmen? Also z.B. was mit Templates?
(Deshalb frag ich im C++ Forum)
-
Is ja kein Problem das mit C++ zur Laufzeit zu bestimmen, aber hat eventuell jemand ne schlaue Idee um das zur Compile-Zeit zu bestimmen?
Also erstmal gibt es für Integer Typen die größer als 2 Byte sind mehr als zwei mögliche Byte-Ordnungen. Insofern ist die Frage "little- oder big-endian?" zu schwach gestellt. Zumindest wenn es um Portabilität geht. Und selbst wenn man sich nur auf little- und big-endian beschränkt, gibt es ja auch Cross-Compiler, die problemlos Code für beide Ordnungen erzeugen können.
Nach dem was ich bisher so gelesen habe gibt es keine Möglichkeit die genaue Byte-Ordnung mittels eines Templates zur Compilezeit zu bestimmen. Der Grund: Endianness definiert wie ein Integer Typ im Speicher abgelegt wird. Demzufolge erfordert ein Test auf Endianness einen Speicherzugriff - also eine Dereferenzierung. Ein Ausdruck, der eine Dereferenzierung enthält ist aber kein Compilezeit-Ausdruck.
Für Fälle wo man wirklich Endian-abhängigen Code schreiben muss ist es wohl besser sich auf Build-Tools wie z.B. autoconf zu verlassen. Die können problemlos die auf der Maschine verwendete Byte-Ordnung herausfinden und dann ein entsprechendes Makro definieren.