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

Lesezeit: 4 Minuten

Wie erkennt man zuverlassig Mac OS X iOS Linux Windows
Äonil

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 zuverlassig Mac OS X iOS Linux Windows
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 seit TARGET_OS_IPHONE ist definiert als 0 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 __unixhier 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

1646961010 289 Wie erkennt man zuverlassig Mac OS X iOS Linux Windows
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__ und linuxaber 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


Wie erkennt man zuverlassig Mac OS X iOS Linux Windows
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.

989470cookie-checkWie erkennt man zuverlässig Mac OS X, iOS, Linux, Windows in C-Präprozessor? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy