c++ c cross-platform c-preprocessor os-detection

c++ - ¿Cómo detectar confiablemente Mac OS X, iOS, Linux, Windows en preprocesador C?



cross-platform c-preprocessor (3)

Si hay algún código C / C ++ multiplataforma que debe compilarse en Mac OS X, iOS, Linux, Windows, ¿cómo puedo detectarlos de manera confiable durante el proceso del preprocesador?


Como señala Jake, TARGET_IPHONE_SIMULATOR es un subconjunto de TARGET_OS_IPHONE.

Además, TARGET_OS_IPHONE es un subconjunto de TARGET_OS_MAC.

Así que un mejor enfoque podría ser:

#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


Hay macros predefinidas que son utilizadas por la mayoría de los compiladores, puede encontrar la lista here . Las macros predefinidas del compilador GCC pueden encontrarse here . Aquí hay un ejemplo para 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

Las macros definidas dependen del compilador que vayas a utilizar.

El _WIN64 #ifdef se puede anidar en el _WIN32 #ifdef porque _WIN32 se define cuando se dirige a Windows, no solo a la versión x86. Esto evita la duplicación de código si algunos incluyen son comunes a ambos.


Una especie de respuesta corolario: las personas en nadeausoftware.com/articles/2012/01/… han tomado el tiempo para hacer tablas de macros definidas para cada par de compilador y sistema operativo .

Por ejemplo, puede ver que _WIN32 NO está definido en Windows con Cygwin (POSIX), mientras que está definido para compilación en Windows, Cygwin (no POSIX) y MinGW con cada compilador disponible (Clang, GNU, Intel, etc.) ).

De todos modos, encontré las mesas bastante informativas y pensé que las compartiría aquí.