Moje gcc (4.3.3) definuje následující předdefinovaná makra související s Linuxem:
$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
Pod VC++ (a mnoha dalšími kompilátory Win32) existuje také několik předdefinovaných maker identifikujících platformu, zejména _WIN32. Další podrobnosti:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx
Neexistuje žádný standardní způsob, jak to udělat. Může být možné vypnout určitá makra, která jsou definována pro každou platformu. Například _WIN32 bude definován ve Windows a téměř jistě ne v Linuxu. Nevím však o žádném odpovídajícím makru pro Linux.
Protože používáte samostatné kompilátory, z toho vyplývá, že máte samostatná prostředí sestavení. Proč prostě nepřidáte makro sami? Visual Studio i GCC podporují definování maker z příkazového řádku, takže je stačí definovat.
Vždy se snažím udržet specifika platformy mimo hlavní kód tím, že to dělám tímto způsobem
platform.h:
#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif
someclass.c:
void SomeClass::SomeFunction()
{
system_related_type t;
// Other code
platform_SystemCall(&t);
// Other code
}
Nyní v windows_platform.h
a linux_platform.h
zadejtedef system_related_type
na nativní typ a buď #define platform_SystemCall
jako nativní volání, nebo vytvořte malou funkci wrapper, pokud je sada argumentů z jedné platformy na druhou příliš odlišná.
Pokud se systémová rozhraní API pro konkrétní úlohu mezi platformami výrazně liší, možná budete muset vytvořit vlastní verzi rozhraní API, která rozdíl rozdělí. Ale většinou existují poměrně přímá mapování mezi různými API na Windows a Linux.
Spíše než se spoléhat na nějaký konkrétní kompilátor #define pro výběr platformy, I #define BUILD_PLATFORM xxx
v souboru projektu nebo makefile, protože ty musí být stejně jedinečné podle platformy.