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í.