Si hay algún código multiplataforma C/C++ que deba compilarse en Mac OS X, iOS, Linux, Windows, ¿cómo puedo detectarlos de manera confiable durante el proceso del preprocesador?Cómo detectar de manera confiable el preprocesador Mac OS X, iOS, Linux, Windows en C?
Respuesta
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.
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
También agregaría '__ANDROID__' arriba' __linux__' ya que tiene sus propios detalles en comparación con Linux. – 4LegsDrivenCat
¿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. –
Mi Linux solo define '__linux__',' __gnu_linux__' y 'linux', pero no' __linux' – Mecki
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í.
- 1. equivalentes Linux/Mac OS X para Windows Communication Foundation
- 2. Sync iOS y Mac OS X datos
- 3. Detectar si el cursor está oculto en Mac OS X
- 4. Utilizando C++ en aplicaciones iOS y Mac OS X
- 5. Mismo código C que produce resultados diferentes en Mac OS X que Windows y Linux
- 6. Symbian C++ Desarrollo bajo Mac OS X
- 7. Emulación de binarios de Linux en Mac OS X
- 8. Objective-C de serie - Mac OS X
- 9. Cómo detectar el evento de clic derecho para Mac OS
- 10. Mac OS X - cambiar el tamaño programáticamente de Windows
- 11. GKSession con Mac OS X
- 12. UIActivityIndicatorView para Mac OS X?
- 13. Detectar Windows o Linux en C, C++
- 14. Ubicación de datos compartidos para Linux y Mac OS X
- 15. JNotify en Mac OS X?
- 16. ¿Cómo crear un servicio de Windows para Mac OS X?
- 17. Aprendiendo ASP.NET MVC en Mac OS X
- 18. ¿Funciona Java FileChannel.tryLock en Mac OS X?
- 19. Uso de un teclado externo "windows" en Mac OS X
- 20. Cómo usar dylib en Mac OS X (C++)
- 21. Windows equivalente al comando "abrir" de Mac OS X
- 22. Actualizaciones de aplicaciones en Mac OS X
- 23. ldconfig para Mac OS X
- 24. ¿Está desarrollando para Mac OS X, en Windows?
- 25. Crear una aplicación multiplataforma para Windows, Mac OS X
- 26. Cómo detectar adecuadamente los sistemas operativos Windows, Linux y Mac
- 27. Cómo detectar la configuración regional actual en Mac OS X desde el shell
- 28. diferente comportamiento de matemáticas de redondeo entre Linux, Mac OS X y Windows
- 29. ¿Cómo obtener el tipo de archivo en Mac OS X?
- 30. Linux equivalente al comando "abrir" de Mac OS X
El PO preguntó específicamente sobre 'Mac OS x' frente' iOS' –
@ Pablo, "código debe ser compilado en Mac OS X, iOS, Linux, Windows" –
@ Pablo, @Evgeny Lo siento por mi error . Mi pregunta incluye Windows y Linux. – Eonil