Die bedingte Kompilierung in C++, basierend auf Betriebssystem
Möchte ich schreiben, ein cross-Plattform-Funktion in C++, die enthält system-Aufrufe. Was bedingte Kompilierungs-flags kann ich überprüfen, um zu bestimmen, welches Betriebssystem die kompiliert wird? Ich bin interessiert meist in Windows und Linux, mithilfe von Visual Studio und GCC.
Ich denke, es sollte in etwa so Aussehen:
void SomeClass::SomeFunction()
{
//Other code
#ifdef LINUX
LinuxSystemCall();
#endif
#ifdef WINDOWS
WindowsSystemCall();
#endif
//Other code
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mein gcc (4.3.3) definiert die folgenden Linux-bezogene vordefinierte Makros:
Unter VC++ (und viele andere Win32-Compiler) es gibt auch ein paar vordefinierte Makros identifizieren der Plattform, insbesondere _WIN32. Weitere details: http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx
Es gibt keine standard-Weg, dies zu tun. Kann es möglich sein, sich bestimmte Makros definiert sind pro Plattform. Zum Beispiel, _WIN32 definiert werden, die auf Windows, und fast sicher nicht Linux. Allerdings weiß ich nicht von entsprechenden Linux-makro.
Weil Sie mit separaten Compiler, daraus folgt, dass man getrennte build-Umgebungen. Warum nicht einfach das makro selbst? Sowohl Visual Studio und GCC unterstützen die Definition von Makros von der Kommandozeile aus, so dass nur Sie definieren.
Ich versuche immer, halten Sie die Plattform Besonderheiten aus dem main-code, indem Sie es auf diese Weise
Plattform.h:
someclass.c:
Nun in
windows_platform.h
undlinux_platform.h
Sie typedefsystem_related_type
zu der einheimischen Art, und entweder#define platform_SystemCall
als die einheimischen nennen, oder erstellen Sie eine kleine wrapper-Funktion, wenn das argument von einer Plattform zur anderen zu unterscheiden.Wenn die system-APIs für eine bestimmte Aufgabe sind Wild zwischen verschiedenen Plattformen, müssen Sie möglicherweise erstellen Sie Ihre eigene version-API teilt den Unterschied. Aber für die meisten Teil, es gibt Recht direkte mappings zwischen den verschiedenen APIs für Windows und Linux.
Anstatt sich auf einige bestimmte compiler #define wählen, Plattform, ich
#define BUILD_PLATFORM xxx
in der Projekt Datei oder ein makefile, da diese eindeutig sein müssen von der Plattform ab trotzdem.Hier ist, was ich verwenden. Es funktioniert unter Visual Studio 2008, und MinGW: