dev - Qué macro para envolver el código específico de Mac OS X en C/C++
compilar c en mac terminal (5)
Al leer varias fuentes C y C ++, he encontrado dos macros __APPLE__
y __OSX__
. Encontré mucho uso de __OSX__
en varios códigos, especialmente los que provienen de *BSD
sistemas *BSD
.
Sin embargo, a veces me parece que probar __OSX__
solo no es suficiente y tengo que completar las pruebas con la macro __APPLE__
.
La línea de comandos de __APPLE__
Unix Tools para las guías de Mac OS X especifica __APPLE__
y adicionalmente __APPLE_CC__
pero no menciona __OSX__
.
La guía de Porting from GCC dice:
- Use
#ifdef __GNUC__
para ajustar cualquier código específico de GCC.- Use
#ifdef __APPLE_CC__
para ajustar cualquier código específico de Mac OS X.
Nuevamente, no se menciona acerca de __OSX__
macro.
¿Qué macro está predefinido en la plataforma Mac OS X y el entorno de desarrollo de XCode que se debe usar para distinguir el código específico de OSX en los programas C / C ++?
¿Dónde se define la macro __OSX__
? ¿Es *BSD
macro específica de *BSD
?
Aquí hay una buena lista de macros para sistemas operativos.
Hay poca información sobre __OSX__
en la web. Estarás a salvo con __APPLE__
.
#ifdef __APPLE__
#include <TargetConditionals.h>
#if TARGET_OS_MAC
...
#endif /* TARGET_OS_MAC */
#endif /* __APPLE__ */
Tenga en cuenta que __OSX__
NO existe, al menos desde Xcode 9.
También tenga en cuenta que es #if TARGET_OS_MAC
no #ifdef
. Siempre está definido, pero es 0 cuando no es macOS.
Normalmente uso __MACH__
para esto. Se ha definido desde la primera versión de OS X (e incluso antes, presumiblemente).
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 computadora Apple.
__APPLE_CC__
Esta macro se establece en un número entero que representa el número de versión del compilador. Esto le permite distinguir, por ejemplo, entre compiladores basados en la misma versión de GCC, pero con correcciones de errores o características diferentes. Los valores más grandes denotan compiladores posteriores.
__OSX__
Presumiblemente, el sistema operativo es una variante particular de OS X
Entonces, dadas las definiciones anteriores, usaría __APPLE__
para distinguir el código específico de Apple.
Utilizar
#if defined(__APPLE__) && defined(__MACH__)
para distinguir Apple MacOS (no iOS).
En cuanto a "de dónde viene OSX ":
Algunas listas en línea de macros de compilación (como esta) listan
__MACOSX__
. Algunos comentarios del foro (como estos) afirman que__OSX__
existe. Estos son incorrectos. No existen tales macros predefinidos por los compiladores de OSX, pero pueden definirse por los archivos Makefiles del proyecto específico y los scripts del detector de plataforma como GNU autoconf.