wake-up-neo.com

Wie erkennt man zuverlässig Mac OS X, iOS, Linux, Windows in C-Präprozessor?

Wenn es plattformübergreifenden C/C++ - Code gibt, der unter Mac OS X, iOS, Linux, Windows kompiliert werden soll, wie kann ich ihn während des Präprozessorprozesses zuverlässig erkennen?

286
Eonil

Es gibt vordefinierte Makros, die von den meisten Compilern verwendet werden. Sie finden die Liste hier . Vordefinierte Makros des GCC-Compilers finden Sie hier . Hier ist ein Beispiel für gcc:

#ifdef _WIN32
   //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 Simulator
    #Elif TARGET_OS_IPHONE
        // iOS device
    #Elif TARGET_OS_MAC
        // Other kinds of Mac OS
    #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 vom Compiler ab, den Sie verwenden möchten.

Der _WIN64#ifdef Kann in den _WIN32#ifdef Geschachtelt werden, da _WIN32 Beim Targeting auf Windows nicht nur für die x86-Version definiert ist. Dies verhindert das Duplizieren von Code, wenn einige Includes beiden gemeinsam sind.

466
Evgeny Gavrin

Wie Jake betont, ist TARGET_IPHONE_SIMULATOR eine Teilmenge von TARGET_OS_IPHONE.

Außerdem ist TARGET_OS_IPHONE 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_IPHONE_SIMULATOR
        // define something for simulator   
    #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
29
PatchyFog

Eine Art logische Konsequenz: Die Benutzer von [diese Site] haben sich die Zeit genommen, Tabellen mit Makros zu erstellen, die für jedes OS/Compiler-Paar definiert wurden .

Zum Beispiel können Sie sehen, dass _WIN32 ist unter Windows mit Cygwin (POSIX) NICHT definiert, während es für die Kompilierung unter Windows, Cygwin (nicht POSIX) und MinGW mit jedem verfügbaren Compiler (Clang, GNU, Intel) IS) definiert ist , usw.).

Wie auch immer, ich fand die Tabellen ziemlich informativ und dachte, ich würde hier teilen.

5
houtanb