Comment détecter Mac OS X, iOS, Linux, Windows de manière fiable dans un préprocesseur C?

S'il y a du code c/" class="blnk">C/C++ multiplate-forme qui devrait être compilé sur Mac OS X, iOS, Linux, Windows, Comment puis-je les détecter de manière fiable pendant le processus de préprocesseur?

265
demandé sur Brian Tompsett - 汤莱恩 2011-05-07 12:37:51

3 réponses

il y a des macros prédéfinies qui sont utilisées par la plupart des compilateurs, vous pouvez trouver la liste ici . GCC compilateur macros prédéfinies peuvent être trouvées ici . Voici un exemple pour 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

Les macros définies dépend du compilateur que vous allez utiliser.

le _WIN64 #ifdef peut être imbriqué dans le _WIN32 #ifdef parce que _WIN32 est défini cibler Windows, pas seulement la version x86. Cela évite la duplication de code si certaines inclusions sont communes aux deux.

434
répondu Evgeny Gavrin 2018-05-03 18:43:43

comme Jake le souligne, TARGET_IPHONE_SIMULATOR est un sous-ensemble de TARGET_OS_IPHONE.

TARGET_OS_IPHONE est un sous-ensemble de TARGET_OS_MAC.

donc une meilleure approche pourrait être:

#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
28
répondu PatchyFog 2013-09-10 21:50:58

sorte de réponse corollaire: les gens sur [ce site] ont pris le temps de faire des tableaux de macros définis pour chaque paire OS/compilateur .

par exemple, vous pouvez voir que _WIN32 N'est pas défini sur Windows avec Cygwin (POSIX), alors qu'il est défini pour compilation sur Windows, Cygwin (non-POSIX), et MinGW avec tous les compilateurs disponibles (Clang, GNU, Intel, etc.).

de toute façon, j'ai trouvé les tables sont très instructives et j'ai pensé partager ici.

1
répondu houtanb 2017-09-12 13:21:49