Compiler per #ifdef bestimmen



  • Hallo,
    man kann ja ein Programm für verschiedene Compiler schreiben, indem man alle Codezeilen, die sich unterscheiden müssen, zwischen

    #ifdef Compilername
    

    und

    #endif
    

    schreibt. Nun meine Frage: Wo sehe ich, wie diese Compiler im Quelltext bezeichnet werden müssen? Ein Beispiel:

    void warten (int zeit)
    {
    #ifdef MicrosoftVisualCPP
        cout.flush ();
        Sleep (zeit);
    #endif
    
    #ifdef BorlandTurboCPP
        delay (zeit);
    #endif
    }
    

    Woher weiß ich, was an die Stelle von MicrosoftVisualCPP bzw. BorlandTurboCPP hingehört? Was mich auch noch interessiert:
    Gibt es eine Art else-if-defined, so daß ich nicht jede Version mit einem eigenen #ifdef einleiten muß?
    Und was muß ich schreiben, damit beim Kompilieren bereits ein Fehler ausgegeben wird? Ich will es also folgendermaßen machen:

    #ifdef MVCPP
        //...
    #else-ifdef /*<-- Wie muß man das schreiben?*/ TCPP
        //...
    #else
        GibBeimKompilierenEinenFehlerAus
    #endif
    


  • ich mach's so:

    //datei arith.hpp
    #ifdef __GNUC__
    #include "compiler/gcc/arith.hpp"
    #endif
    
    #ifdef _MSC_VER
    #include "compiler/msvc/arith.hpp"
    #endif
    

    in den jeweiligen compilerspezifischen dateien werden dann funktionen definiert. benutzt jemand einen unbekannten compiler, sind die funktionen nicht da. solange er sie nicht aufrufen mag, gibt's keinen fehler.
    jetzt wirf mal goole an und siche nach __GNUC__ und _MSC_VER und du wirst schon auf fremde ifdef-orgien stoßen, die mehr compiler kennen.

    Gibt es eine Art else-if-defined, so daß ich nicht jede Version mit einem eigenen #ifdef einleiten muß?
    

    #elif defined

    und

    #error GibBeimKompilierenEinenFehlerAus



  • Hallo,

    eine Liste mit Compiler-Direktiven findest du hier: http://predef.sourceforge.net/

    MfG

    GPC



  • Du solltest Dir vielleicht mal ansehen wie boost das macht. Wenn Du die boost libraries geladen hast, findest Du die Selektion des Compilers in der Datei "boost/config/select_compiler_config.hpp".

    Zu diesem Thema der compiler-abhängigen Programmierung bietet boost auch ein eigenes Tool an.

    Gruß
    Werner



  • Vielen Dank für die Hilfe.


Anmelden zum Antworten