Estoy escribiendo un código multiplataforma, que debería compilarse en Linux, Windows, Mac OS. En Windows, debo admitir visual studio y mingw.
Hay algunas piezas de código específico de la plataforma, que debería colocar en el #ifdef .. #endif
entorno. Por ejemplo, aquí coloqué el código específico de win32:
#ifdef WIN32
#include <windows.h>
#endif
Pero, ¿cómo reconozco Linux y Mac OS? ¿Cuáles son los nombres definidos (o etc.) que debo usar?
c++
macros
cross-platform
c-preprocessor
Arenim
fuente
fuente
Respuestas:
Para Mac OS :
Para MingW en Windows:
Para Linux :
Para otros compiladores de Windows, consulte este hilo y este para varios otros compiladores y arquitecturas.
fuente
__APPLE__
Distingue entre OSX e iOS?__APPLE__
está configurado para OS X e iOS. Puedes#include <TargetConditionals.h>
adentro#ifdef __APPLE__
, lo que luego te da unTARGET_OS_IPHONE #define
.__MINGW64__
también está disponible cuando se usa mingw64__MINGW64__
se hace referencia,_MSC_VER
vale la pena mencionar Think for Windows / MSVC (que también se puede usar para verificar la versión de MSVC).Ver: http://predef.sourceforge.net/index.php
Este proyecto proporciona una lista razonablemente completa de predefinidos
#defines
para muchos sistemas operativos, compiladores, estándares de plataforma y lenguaje y bibliotecas estándar.fuente
Esto es lo que uso:
EDITAR: Aunque lo anterior podría funcionar para lo básico, recuerde verificar qué macro desea verificar consultando las páginas de referencia de Boost.Predef . O simplemente use Boost.Predef directamente.
fuente
#if
pregunta si está definido, los otros prueban el valor. Si sería más consistente hacerlo#elif defined(__unix__)
, etc., creo.Si está escribiendo C ++, no puedo recomendar el uso de las bibliotecas de Boost con suficiente fuerza.
La última versión (1.55) incluye una nueva biblioteca Predef que cubre exactamente lo que está buscando , junto con docenas de otras macros de reconocimiento de plataformas y arquitectura.
fuente