Wenn es einen plattformübergreifenden C/C++-Code gibt, der auf Mac OS X, iOS, Linux, Windows kompiliert werden sollte, wie kann ich ihn während des Präprozessorprozesses zuverlässig erkennen?
Wie erkennt man zuverlässig Mac OS X, iOS, Linux, Windows in C-Präprozessor? [duplicate]
Äonil
Eugen Gavrin
Es gibt vordefinierte Makros, die von den meisten Compilern verwendet werden, Sie können die Liste finden Hier. Vordefinierte Makros des GCC-Compilers sind zu finden Hier. Hier ist ein Beispiel für gcc:
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
//define something for Windows (32-bit and 64-bit, this part is common)
#ifdef _WIN64
//define something for Windows (64-bit only)
#else
//define something for Windows (32-bit only)
#endif
#elif __APPLE__
#include <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR
// iOS, tvOS, or watchOS Simulator
#elif TARGET_OS_MACCATALYST
// Mac's Catalyst (ports iOS API into Mac, like UIKit).
#elif TARGET_OS_IPHONE
// iOS, tvOS, or watchOS device
#elif TARGET_OS_MAC
// Other kinds of Apple platforms
#else
# error "Unknown Apple platform"
#endif
#elif __linux__
// linux
#elif __unix__ // all unices not caught above
// Unix
#elif defined(_POSIX_VERSION)
// POSIX
#else
# error "Unknown compiler"
#endif
Die definierten Makros hängen von dem Compiler ab, den Sie verwenden werden.
Die _WIN64
#ifdef
kann in die verschachtelt werden _WIN32
#ifdef
da _WIN32
ist sogar definiert, wenn auf die Windows x64-Version abgezielt wird. Dies verhindert Codeduplizierung, wenn einige Header-Includes beiden gemeinsam sind (auch WIN32
ohne Unterstrich erlaubt IDE, die richtige Codepartition hervorzuheben).
-
@Paul, “Code sollte unter Mac OS X, iOS, Linux, Windows kompiliert werden”
– Jewgeni Gavrin
7. Mai 2011 um 9:21 Uhr
-
Es gibt noch mehr … es sollte sein
#if TARGET_OS_IPHONE
eher, als#ifdef
seitTARGET_OS_IPHONE
ist definiert als0
auf einem Mac.– Steven Lu
21. Juni 2012 um 5:45 Uhr
-
Laut SourceForge ist _WIN32 sowohl für 32- als auch für 64-Bit-Versionen von Windows definiert, sollte _WIN64 also nicht vor _WIN32 stehen?
– MFH
7. Juli 2012 um 10:52 Uhr
-
@jdknight ja
__linux__
ist das unterstützte Makro auf allen Linux-Distributionen,__linux
wird nicht von allen Linux-Distributionen unterstützt,__unix__
sollte auch anstelle von verwendet werden__unix
aus dem gleichen Grund, da alle Plattformen, die den Unix-Richtlinien folgen, Unterstützung bieten__unix__
und nicht__unix
hier ist eine ausführlichere Beschreibung nadeausoftware.com/articles/2012/01/…– Daniel
6. Oktober 2015 um 21:02 Uhr
-
auch hinzufügen
__ANDROID__
– fnc12
26. September 2016 um 7:09 Uhr
PatchyFog
Wie Jake betont, TARGET_IPHONE_SIMULATOR
ist eine Teilmenge von TARGET_OS_IPHONE
.
Ebenfalls, TARGET_OS_IPHONE
ist eine Teilmenge von TARGET_OS_MAC
.
Ein besserer Ansatz könnte also sein:
#ifdef _WIN64
//define something for Windows (64-bit)
#elif _WIN32
//define something for Windows (32-bit)
#elif __APPLE__
#include "TargetConditionals.h"
#if TARGET_OS_IPHONE && TARGET_OS_SIMULATOR
// define something for simulator
// (although, checking for TARGET_OS_IPHONE should not be required).
#elif TARGET_OS_IPHONE && TARGET_OS_MACCATALYST
// define something for Mac's Catalyst
#elif TARGET_OS_IPHONE
// define something for iphone
#else
#define TARGET_OS_OSX 1
// define something for OSX
#endif
#elif __linux
// linux
#elif __unix // all unices not caught above
// Unix
#elif __posix
// POSIX
#endif
Notiz das oben überprüft TARGET_OS_SIMULATOR
Makro weil TARGET_IPHONE_SIMULATOR
Makro ist seit iOS 14 veraltet.
-
Ich würde auch hinzufügen
__ANDROID__
Oben__linux__
da es im Vergleich zu Linux seine eigenen Besonderheiten hat.– 4LegsDrivenCat
22. November 2016 um 11:23 Uhr
-
Würde dies nicht erfordern, dass Windows-spezifischer Code, der für 32- und 64-Bit gleich ist, in der dupliziert wird
_WIN64
und_WIN32
Blöcke? Es wird das überspringen_WIN32
eine, wenn es erkennt_WIN64
, was möglicherweise nicht wünschenswert ist. Etwas wie Das könnte besser funktionieren.– Justin Time – Wiedereinsetzung von Monica
5. Januar 2017 um 7:56 Uhr
-
Mein Linux definiert nur
__linux__
,__gnu_linux__
undlinux
aber nicht__linux
– Mecki
24. April 2017 um 13:39 Uhr
-
Was ist
#define TARGET_OS_OSX 1
? Apple und OS X definieren eigene Makros.– jww
17. Februar 2018 um 1:32 Uhr
houtanb
5. Januar 2021: Linkaktualisierung dank @Sadaps Kommentar.
Eine Art Folgeantwort: die Leute an Diese Seite haben sich die Zeit genommen, Tabellen zu erstellen Makros, die für jedes OS/Compiler-Paar definiert sind.
Das sieht man zum Beispiel _WIN32
ist NICHT unter Windows mit Cygwin (POSIX) definiert, während es für die Kompilierung unter Windows, Cygwin (nicht-POSIX) und MinGW mit jedem verfügbaren Compiler (Clang, GNU, Intel usw.) definiert ist.
Wie auch immer, ich fand die Tabellen ziemlich informativ und dachte, ich würde sie hier teilen.
-
Der Link ist tot.
– Lindydancer
16. Oktober 2020 um 12:58 Uhr
-
@ Lindy Dancer web.archive.org/web/20191012035921/http://nadeausoftware.com/…
– bb1950328
5. Januar 2021 um 7:43 Uhr