endian zur Compilezeit detektieren



  • Hallo Profies,

    hat irgendjemand eine Idee wie man den Endian (big endian, littel endian) zur Compilezeit erkennen kann. Mir schwebt so was vor wie eine struct is_little_endian {??}, die dann als Template-Argument in einem boost::enable_if-Ausdruck landet.

    Gruß
    Werner



  • Da ein Kompiler meistens zuerst in eine Zwischensprache übersetzt und es von dieser dann auf einen Littel- und/oder Big-Endian Zielrechner gehen kann, dürfte es eher unwahrscheinlich sein, dass man diese Informationen herausbekommt. Die Templates werden schliesslich ausgewertet, bevor diese Information überhaupt vorhanden ist.

    Es wäre höchstens über Makros denkbar, welche der Kompiler zur Verfügung stellt, womit das eingestellte Zielsystem angegeben wird. Aber dies wäre dann natürlich kompilerabhängig.

    Grüssli



  • google mal nach "boost endian" - es gab wohl mal einen Ansatz, ein entsprechendes Bibliothekchen zu schreiben, der aber (wegen fehlender Features in C++?) nicht weiter verfolgt wurde. Wenn die das nicht hinbekommen wirds schwierig denk ich mal 😉



  • @pumuckl: Der Tipp war gut. Es existiert die Datei boost/detail/endian.hpp, in der je nach verwendeter Plattform BOOST_LITTLE/BIG_ENDIAN gesetzt wird.
    Das wird dort einfach mit #if defined( 'die eine Plattform' ) #elif defined( 'die andere Plattform' ) gelöst. Wie Dravere schon vermutet hat, dürfte das wohl der einzige gangbare Weg sein.

    Gruß
    Werner



  • Sowas wird oft vor dem kompilieren beim configure überprüft. Vielleicht ist das ja eine Option für dich. Einige Build Systeme bieten soetwas an. Es ein kleines Programm bei dem der Unterschied deutlich ist compiliert und ausgeführt. Je nach Ausgabe wird dann das Define in einem Header gesetzt.



  • Naja mit dem Boost-Header hat er das ja für die gängigsten Systeme schon, ohne dass er da extra noch n Programm im configure laufen lassen muss...



  • Wieso geht sowas nicht?

    static bool isLittleEndian()
    {
        static const short int word = 0x0001;
        static const char* byte = reinterpret_cast<const char *>(&word);
        return (byte[0] ? true : false);
    }
    


  • Weil das reinterpret cast auf die Adresse erst zur Laufzeit ausgwertet wird. Zur Compile Zeit hat word noch keine Adresse, die man zu irgendwas benutzen könnte.



  • ups, klar!
    Frage verfehlt, setzen sechs 😉



  • Man kann das Programm aber in seinen build-Prozess einbinden und abhaengig vom Ergebnis einige defines des Kompilers setzen.



  • knivil schrieb:

    Man kann das Programm aber in seinen build-Prozess einbinden und abhaengig vom Ergebnis einige defines des Kompilers setzen.

    Und was ist mit Cross-Compilation? Einfach die defines benutzen und gut ist.


Log in to reply