Jak niezawodnie wykryć Mac OS X, iOS, Linux, Windows w preprocesorze C?

Jeśli istnieje jakiś wieloplatformowy kod C / C++, który powinien być skompilowany na Mac OS X, iOS, Linux, Windows, Jak mogę je niezawodnie wykryć podczas procesu preprocesora?

Author: Brian Tompsett - 汤莱恩, 2011-05-07

3 answers

Istnieją predefiniowane makra, które są używane przez większość kompilatorów, listę znajdziesz tutaj. Predefiniowane makra kompilatora GCC można znaleźć tutaj . Oto przykład dla 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

Zdefiniowane makra zależą od kompilatora, którego będziesz używać.

The _WIN64 #ifdef można zagnieżdżać w _WIN32 #ifdef ponieważ _WIN32 jest definiowane podczas targetowania Windows, a nie tylko wersji x86. Zapobiega to powielaniu kodu, jeśli niektóre elementy są wspólne dla obu.

 434
Author: Evgeny Gavrin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-03 18:43:43

Jak wskazuje Jake, TARGET_IPHONE_SIMULATOR jest podzbiorem TARGET_OS_IPHONE.

Ponadto, TARGET_OS_IPHONE jest podzbiorem TARGET_OS_MAC.

Więc lepszym podejściem może być:

#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
Author: PatchyFog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-10 21:50:58

Taka następcza odpowiedź: Ludzie na [tej stronie] poświęcili czas na tworzenie tabel makrzdefiniowanych dla każdej pary OS/kompilator .

Na przykład, widać, że {[0] } nie jest zdefiniowana w systemie Windows za pomocą Cygwin( POSIX), podczas gdy jest zdefiniowana dla kompilacji w systemach Windows, Cygwin (non-POSIX) i MinGW dla każdego dostępnego kompilatora (clang, GNU, Intel, itp.).

W każdym razie, znalazłem tabele dość pouczające i pomyślałem, że podzielę się tutaj.

 1
Author: houtanb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-12 13:21:49