Ich brauche meinen Code, um verschiedene Dinge zu tun, basierend auf dem Betriebssystem, auf dem er kompiliert wird. Ich suche so etwas:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Gibt es eine Möglichkeit, dies zu tun? Gibt es einen besseren Weg, um das Gleiche zu tun?
c
operating-system
c-preprocessor
conditional-compilation
Perimosocordiae
quelle
quelle
C
nichtC++
Antworten:
Die Site Vordefinierte Makros für das Betriebssystem enthält eine sehr vollständige Liste der Überprüfungen. Hier sind einige davon mit Links zu ihrem Fundort:
Windows
_WIN32
_WIN64
Nur 32-Bit- und 64-Bit- 64-BitUnix (Linux, * BSD, Mac OS X)
In dieser verwandten Frage finden Sie einige Fallstricke bei der Verwendung dieser Prüfung.
unix
__unix
__unix__
Mac OS X
__APPLE__
__MACH__
Beide sind definiert; Überprüfen, ob beides funktioniert.
Linux
__linux__
linux
Veraltet (nicht POSIX-konform)__linux
Veraltet (nicht POSIX-konform)FreeBSD
__FreeBSD__
Android
__ANDROID__
quelle
__unix__
. Warum würden Sie es in die Liste aufnehmen?unix
Symbole und definiert sie nicht. Seien Siewin32
also vorsichtig. OTOH definiert es__CYGWIN__
.__linux__
gleiche wie__ANDROID__
??show GCC definiert unter Windows:
unter Linux:
Vordefinierte Makros in MinGW:
unter UNIX:
quelle
Basierend auf Nadeausoftware und der Antwort von Lambda Fairy .
Getestet mit GCC und klirrend an:
quelle
In den meisten Fällen ist es besser zu überprüfen, ob eine bestimmte Funktionalität vorhanden ist oder nicht. Zum Beispiel: ob die Funktion
pipe()
existiert oder nicht.quelle
quelle
Microsoft C / C ++ - Compiler (MSVC) Vordefinierte Makros finden Sie hier
Ich denke du suchst:
gcc compiler PreDefined MAcros finden Sie hier
Ich denke du suchst:
Führen Sie eine Google-Suche nach den entsprechenden vordefinierten Compilern durch.
quelle
Es gibt kein Standardmakro, das gemäß dem C-Standard eingestellt ist. Einige C-Compiler legen auf einigen Plattformen einen fest (z. B. setzt das gepatchte GCC von Apple ein Makro, um anzuzeigen, dass es auf einem Apple-System und für die Darwin-Plattform kompiliert wird). Ihre Plattform und / oder Ihr C-Compiler stellen möglicherweise auch etwas ein, aber es gibt keinen allgemeinen Weg.
Wie Hayalci sagte, ist es am besten, diese Makros irgendwie in Ihrem Erstellungsprozess zu haben. Mit den meisten Compilern ist es einfach, ein Makro zu definieren, ohne den Code zu ändern. Sie können einfach
-D MACRO
an GCC übergeben, dhUnd in Ihrem Code:
quelle
In MinGW
_WIN32
funktioniert die Definitionsprüfung nicht. Hier ist eine Lösung:Weitere Informationen finden Sie unter: https://sourceforge.net/p/predef/wiki/OperatingSystems/
quelle
Verwenden Sie
#define OSsymbol
und#ifdef OSsymbol
wo OSsymbol ein fähiges#define
Symbol ist, das Ihr Zielbetriebssystem identifiziert.Normalerweise fügen Sie eine zentrale Header-Datei hinzu, die das ausgewählte Betriebssystemsymbol definiert, und verwenden zum Kompilieren und Erstellen betriebssystemspezifische Include- und Bibliotheksverzeichnisse.
Sie haben Ihre Entwicklungsumgebung nicht angegeben, aber ich bin mir ziemlich sicher, dass Ihr Compiler globale Definitionen für gängige Plattformen und Betriebssysteme bereitstellt.
Siehe auch http://en.wikibooks.org/wiki/C_Programming/Preprocessor
quelle
Um alles zusammenzufassen, hier sind einige hilfreiche Links.
libportable
quelle
Entschuldigen Sie die externe Referenz, aber ich denke, sie passt zu Ihrer Frage:
C / C ++ - Tipp: So erkennen Sie den Betriebssystemtyp mithilfe vom Compiler vordefinierter Makros
quelle
Sie können
Boost.Predef
verschiedene vordefinierte Makros für die Zielplattform einschließlich des Betriebssystems (BOOST_OS_*
) verwenden. Ja, Boost wird oft als C ++ - Bibliothek angesehen, aber dies ist ein Präprozessor-Header, der auch mit C funktioniert!Beispielsweise
Die vollständige Liste finden Sie in den
BOOST_OS
Betriebssystemmakrosquelle
Ich habe hier keine Haiku- Definition gefunden. Um vollständig zu sein, ist die Haiku-os-Definition einfach
__HAIKU__
quelle
Einige Compiler generieren #defines, die Ihnen dabei helfen können. Lesen Sie die Compiler-Dokumentation, um festzustellen, um welche es sich handelt. MSVC definiert eine, die
__WIN32__
, GCC einige hat man mit sehen könnentouch foo.h; gcc -dM foo.h
quelle
Sie können Pre-Prozessor-Direktiven als verwenden Warnung oder Fehler verwenden , um zu überprüfen, ob Siedieses Programm zurKompilierungszeit überhaupt nicht ausführen müssen. Kompilieren Sie eseinfach.
quelle
Ich habe eine geschrieben kleine Bibliothek geschrieben , um das Betriebssystem zu erhalten, auf dem Sie sich befinden. Sie kann mit clib (The C package manager) installiert werden , sodass es sehr einfach ist, sie als Abhängigkeit für Ihre Projekte zu verwenden.
Installieren
Verwendung
Es gibt eine Zeichenfolge (
char*
) mit dem Namen des verwendeten Betriebssystems zurück. Weitere Informationen zu diesem Projekt finden Sie in der Dokumentation zu Github .quelle