Mi gcc (4.3.3) define las siguientes macros predefinidas relacionadas con Linux:
$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
Bajo VC++ (y muchos otros compiladores de Win32) también hay un par de macros predefinidas que identifican la plataforma, sobre todo _WIN32. Más detalles:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx
No hay una forma estándar de hacer esto. Puede ser posible desactivar ciertas macros que se definen por plataforma. Por ejemplo, _WIN32 se definirá en Windows y casi seguro que no en Linux. Sin embargo, no conozco ninguna macro de Linux correspondiente.
Debido a que está utilizando compiladores separados, se deduce que tiene entornos de compilación separados. ¿Por qué no simplemente agregar la macro usted mismo? Tanto Visual Studio como GCC admiten la definición de macros desde la línea de comandos, así que simplemente defínalas.
Siempre trato de mantener las especificaciones de la plataforma fuera del código principal haciéndolo de esta manera
plataforma.h:
#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif
algunaclase.c:
void SomeClass::SomeFunction()
{
system_related_type t;
// Other code
platform_SystemCall(&t);
// Other code
}
Ahora en windows_platform.h
y linux_platform.h
escribes def system_related_type
al tipo nativo, y #define platform_SystemCall
como la llamada nativa, o cree una pequeña función contenedora, si el conjunto de argumentos de una plataforma a otra es demasiado diferente.
Si las API del sistema para una tarea en particular son muy diferentes entre plataformas, es posible que deba crear su propia versión de API que divida la diferencia. Pero en su mayor parte, existen asignaciones bastante directas entre las diversas API en Windows y Linux.
En lugar de confiar en algún compilador en particular #define para seleccionar la plataforma, #define BUILD_PLATFORM xxx
en el archivo del proyecto o makefile, ya que de todos modos tienen que ser únicos por plataforma.