2010-01-30 11 views
31

Al leer varias fuentes C y C++, he encontrado dos macros __APPLE__ y __OSX__. Encontré un montón de uso de __OSX__ en varios códigos, especialmente los procedentes de los sistemas *BSD.Qué macro para ajustar el código específico de Mac OS X en C/C++

Sin embargo, a veces me parece que probar __OSX__ solo no es suficiente y tengo que completar las pruebas con macro __APPLE__.

Las guías Porting Command Line Unix Tools to Mac OS X especifica __APPLE__ y, además, __APPLE_CC__ pero no hace mención no__OSX__.

La guía Porting from GCC dice:

  • #ifdef __GNUC__ uso para envolver cualquier código-CCG específica.
  • Use #ifdef __APPLE_CC__ para ajustar cualquier código específico de Mac OS X.

Una vez más, ninguna mención sobre __OSX__ macro.

¿Qué macro está predefinida en la plataforma Mac OS X y en el entorno de desarrollo de XCode que se debe usar para distinguir el código OSX específico en los programas C/C++?

¿Dónde se define el macro __OSX__? ¿Es *BSD macro específico?

+0

Qt usa incluso una definición diferente: 'Q_OS_OSX' – math

Respuesta

20

Todo depende.

Cada macro especifica algo diferente en significado.
Ver: https://developer.apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//apple_ref/doc/uid/TP40002850-SW13

__APPLE__

Esta macro se define en cualquier ordenador Apple.

__APPLE_CC__

Esta macro se establece en un entero que representa el número de versión de el compilador. Esto le permite distinguir, por ejemplo, entre los compiladores basados ​​en la misma versión de GCC, pero con correcciones de errores o funciones diferentes. Los valores más grandes denotan compiladores posteriores.

__OSX__

Presumabley el sistema operativo es una variante particular del OS X

Así dadas las definiciones anteriores que yo usaría para distinguir __APPLE__ código específico de manzana.

+0

Sí, entiendo la diferencia de las macros' __APPLE__' y '__APPLE_CC__' - He vinculado desde mis preguntas a la misma guía. Por cierto, usted incluyó la macro '__OSX__' dentro de la cita de la guía y uno puede entender que es una explicación de la guía vinculada, pero es su comentario. Me confundí un poco :-) – mloskot

+2

El enlace está desactualizado. – Zammbi

+1

@Zammbi Enlace fijo. –

9

Aquí hay un nice list de macros para sistemas operativos.

Hay poca información sobre __OSX__ en la web. Estarás a salvo con __APPLE__.

+0

+1 para ti y Martin York. ¡Gracias! Sin embargo, todavía tengo mucha curiosidad sobre de dónde proviene '__OSX__', así que esperaré un poco para marcar mi pregunta como respondida. – mloskot

3

Normalmente uso __MACH__ para esto. Se ha definido desde la primera versión de OS X (e incluso antes, presumiblemente).

+1

'__MACH__' también se utiliza para GNU/Hurd porque este último utiliza actualmente un kernel Mach. – kennytm

+0

@KennyTM - gracias por eso - No sabía que había otros sistemas que usan '__MACH__'. Sin embargo, para mis propósitos es lo suficientemente bueno, ya que normalmente solo me preocupo por Mac OS X v Linux v Windows. –

+0

Paul, gracias por la sugerencia, es útil pero realmente no responde mi pregunta original. Me gustaría saber con precisión de dónde viene el '__OSX__'. – mloskot