Il mio gcc (4.3.3) definisce le seguenti macro predefinite relative a Linux:
$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
Sotto VC++ (e molti altri compilatori Win32) ci sono anche un paio di macro predefinite che identificano la piattaforma, in particolare _WIN32. Ulteriori dettagli:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx
Non esiste un modo standard per farlo. Potrebbe essere possibile disattivare determinate macro definite per piattaforma. Ad esempio, _WIN32 sarà definito su Windows e quasi certamente non su Linux. Tuttavia non conosco alcuna macro Linux corrispondente.
Poiché si utilizzano compilatori separati, ne consegue che si dispone di ambienti di compilazione separati. Perché non aggiungere tu stesso la macro? Sia Visual Studio che GCC supportano la definizione di macro dalla riga di comando, quindi basta definirle.
Cerco sempre di mantenere le specifiche della piattaforma fuori dal codice principale in questo modo
piattaforma.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
}
Ora in windows_platform.h
e linux_platform.h
digiti system_related_type
al tipo nativo e #define platform_SystemCall
come chiamata nativa, o creare una piccola funzione wrapper, se l'argomento impostato da una piattaforma all'altra è troppo diverso.
Se le API di sistema per una particolare attività sono molto diverse tra le piattaforme, potrebbe essere necessario creare la propria API di versione che divide la differenza. Ma per la maggior parte, ci sono mappature abbastanza dirette tra le varie API su Windows e Linux.
Piuttosto che fare affidamento su qualche particolare compilatore #define per selezionare la piattaforma, io #define BUILD_PLATFORM xxx
nel file di progetto o nel makefile, dal momento che devono comunque essere univoci per piattaforma.