¿Cómo identificar plataforma / comstackdor desde macros de preprocesador?

Estoy escribiendo un código multiplataforma, que debe comstackrse en Linux, Windows, Mac OS. En Windows, debo apoyar visual studio y mingw.

Hay algunos fragmentos de código específicos de la plataforma, que debo colocar en el #ifdef .. #endif . Por ejemplo, aquí puse el código específico de win32:

 #ifdef WIN32 #include  #endif 

Pero, ¿cómo reconozco Linux y Mac OS? ¿Cuáles son los nombres definidos (o etc.) que debo usar?

Para Mac OS :

 #ifdef __APPLE__ 

Para MingW en Windows:

 #ifdef __MINGW32__ 

Para Linux :

 #ifdef __linux__ 

Para otros comstackdores de Windows, verifique este hilo y esto para otros comstackdores y architectures.

Ver: http://predef.sourceforge.net/index.php

Este proyecto proporciona una lista razonablemente completa de #defines definiciones predefinidas para muchos sistemas operativos, comstackdores, estándares de plataforma y lenguaje y bibliotecas estándar.

Esto es lo que uso:

 #ifdef _WIN32 // note the underscore: without it, it's not msdn official! // Windows (x64 and x86) #elif __unix__ // all unices, not all compilers // Unix #elif __linux__ // linux #elif __APPLE__ // Mac OS, not sure if this is covered by __posix__ and/or __unix__ though... #endif 

EDITAR: aunque lo anterior podría funcionar para los aspectos básicos, recuerde verificar qué macro desea verificar mirando las páginas de referencia de Boost.Predef . O simplemente usa Boost.Predef directamente.

Si está escribiendo C ++, no puedo recomendar el uso de las bibliotecas de Boost con la 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 plataforma y architecture.

 #include  // ... #if BOOST_OS_WINDOWS #elif BOOST_OS_LINUX #elif BOOST_OS_MACOS #endif