2011-05-07 16 views

Respuesta

405

Hay macros predefinidas que son utilizados por la mayoría de los compiladores, se puede encontrar la lista [here]. Las macros predefinidas del compilador de GCC se pueden encontrar [here]. Aquí se muestra un ejemplo de 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 

Este macroses definidos depende de compilador que se va a utilizar.

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

+0

El PO preguntó específicamente sobre 'Mac OS x' frente' iOS' –

+4

@ Pablo, "código debe ser compilado en Mac OS X, iOS, Linux, Windows" –

+0

@ Pablo, @Evgeny Lo siento por mi error . Mi pregunta incluye Windows y Linux. – Eonil

27

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.

lo tanto, 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 
+0

También agregaría '__ANDROID__' arriba' __linux__' ya que tiene sus propios detalles en comparación con Linux. – 4LegsDrivenCat

+0

¿No requeriría esto que cualquier código específico para Windows, que sea el mismo para 32 y 64 bits, se duplique en los bloques '_WIN64' y' _WIN32'? Va a omitir el '_WIN32' uno si detecta' _WIN64', que puede no ser deseable. Algo como [esto] (http://pastebin.com/4qTShCq1) podría funcionar mejor. –

+0

Mi Linux solo define '__linux__',' __gnu_linux__' y 'linux', pero no' __linux' – Mecki

1

especie de respuesta corolario: la gente en [this site] han tomado el tiempo para hacer las tablas de macros definidas por cada par de OS/compilador.

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

De todos modos, me encontré con las mesas muy informativo y pensé en compartir aquí.

+0

el enlace ya no funciona – katta

+0

@katta intente de nuevo, me funciona ... – houtanb

Cuestiones relacionadas