Mon gcc (4.3.3) définit les macros prédéfinies suivantes liées à Linux :
$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
Sous VC++ (et de nombreux autres compilateurs Win32), il existe également quelques macros prédéfinies identifiant la plate-forme, notamment _WIN32. Plus de détails :http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx
Il n'y a pas de méthode standard pour le faire. Il peut être possible de désactiver certaines macros définies par plate-forme. Par exemple, _WIN32 sera défini sur Windows et presque certainement pas sur Linux. Cependant, je ne connais aucune macro Linux correspondante.
Étant donné que vous utilisez des compilateurs distincts, il s'ensuit que vous disposez d'environnements de génération distincts. Pourquoi ne pas simplement ajouter la macro vous-même ? Visual Studio et GCC prennent en charge la définition de macros à partir de la ligne de commande, il vous suffit donc de les définir.
J'essaie toujours de garder les spécificités de la plate-forme hors du code principal en procédant de cette façon
plate-forme.h :
#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif
uneclasse.c :
void SomeClass::SomeFunction()
{
system_related_type t;
// Other code
platform_SystemCall(&t);
// Other code
}
Maintenant en windows_platform.h
et linux_platform.h
tu tapes system_related_type
au type natif, et soit #define platform_SystemCall
comme appel natif, ou créez une petite fonction wrapper, si l'argument défini d'une plate-forme à l'autre est trop différent.
Si les API système pour une tâche particulière sont très différentes d'une plate-forme à l'autre, vous devrez peut-être créer votre propre version d'API qui divise la différence. Mais pour la plupart, il existe des mappages assez directs entre les différentes API sous Windows et Linux.
Plutôt que de compter sur un compilateur particulier #define pour sélectionner la plate-forme, j'ai #define BUILD_PLATFORM xxx
dans le fichier de projet ou le makefile, car ceux-ci doivent de toute façon être uniques par plate-forme.