Mein gcc (4.3.3) definiert die folgenden Linux-bezogenen vordefinierten Makros:
$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
Unter VC++ (und vielen anderen Win32-Compilern) gibt es auch einige vordefinierte Makros, die die Plattform identifizieren, insbesondere _WIN32. Weitere Details:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx
Dafür gibt es keine Standardmethode. Es kann möglich sein, bestimmte Makros, die pro Plattform definiert sind, auszuschalten. Beispielsweise wird _WIN32 unter Windows definiert und mit ziemlicher Sicherheit nicht unter Linux. Ich kenne jedoch kein entsprechendes Linux-Makro.
Da Sie separate Compiler verwenden, haben Sie folglich auch separate Build-Umgebungen. Warum fügst du das Makro nicht einfach selbst hinzu? Sowohl Visual Studio als auch GCC unterstützen die Definition von Makros über die Befehlszeile, also definieren Sie sie einfach.
Ich versuche immer, die Plattformspezifika aus dem Hauptcode herauszuhalten, indem ich es so mache
Plattform.h:
#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif
irgendeineklasse.c:
void SomeClass::SomeFunction()
{
system_related_type t;
// Other code
platform_SystemCall(&t);
// Other code
}
Jetzt in windows_platform.h
und linux_platform.h
Sie geben system_related_type
ein zum nativen Typ und entweder #define platform_SystemCall
B. den nativen Aufruf, oder erstellen Sie eine kleine Wrapper-Funktion, wenn die Argumente von einer Plattform zur anderen zu unterschiedlich sind.
Wenn sich die System-APIs für eine bestimmte Aufgabe zwischen den Plattformen stark unterscheiden, müssen Sie möglicherweise Ihre eigene Versions-API erstellen, die den Unterschied aufteilt. Aber zum größten Teil gibt es ziemlich direkte Zuordnungen zwischen den verschiedenen APIs unter Windows und Linux.
Anstatt sich auf einen bestimmten Compiler #define zu verlassen, um die Plattform auszuwählen, habe ich #define BUILD_PLATFORM xxx
in der Projektdatei oder im Makefile, da diese sowieso plattformspezifisch eindeutig sein müssen.