c++ - predefined - Wie erkennt man zuverlässig Mac OS X, iOS, Linux, Windows im C-Präprozessor?




qnx preprocessor define (2)

Eine Art logische Antwort: Die Leute auf nadeausoftware.com/articles/2012/01/… haben sich die Zeit genommen, Makro- Tabellen für jedes OS / Compiler-Paar zu erstellen .

Beispielsweise können Sie sehen, dass _WIN32 unter Windows nicht mit Cygwin (POSIX) definiert ist, 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. ).

Jedenfalls fand ich die Tische ziemlich informativ und dachte, ich würde sie hier teilen.

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


Es gibt vordefinierte Makros, die von den meisten Compilern verwendet werden. Sie finden die Liste here . GCC-Compiler vordefinierte Makros finden Sie here . 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 von dem Compiler ab, den Sie verwenden werden.

Der _WIN64 #ifdef kann in _WIN32 #ifdef verschachtelt werden, da _WIN32 definiert ist, wenn er auf Windows und nicht nur auf die x86-Version _WIN32 . Dies verhindert Code-Duplizierung, wenn einige Includes beiden gemeinsam sind.





os-detection