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 Compilernameund
#endifschreibt. 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" #endifin 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
-
-
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.