Siempre trato de mantener las características específicas de la plataforma del código principal de hacerlo de esta manera
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
}
Ahora en windows_platform.h
y linux_platform.h
typedef system_related_type
al tipo nativo, y #define platform_SystemCall
como la llamada nativa, o crea una función de envoltura pequeña , si el argumento establecido de una plataforma a otra es demasiado diferente.
Si las API del sistema para una tarea en particular son muy diferentes entre plataformas, puede que necesite crear su propia API de versión que divide la diferencia. Pero en su mayor parte, existen asignaciones bastante directas entre las diversas API en Windows y Linux.
En lugar de confiar en un determinado compilador #define para seleccionar la plataforma, defino BUILD_PLATFORM en el archivo de proyecto o en el archivo MAKE, ya que tienen que ser únicos por plataforma de todos modos.
Hay una Gotcha cuando se trata de Win32/Win64 compilación condicional - cuando se compila para Win64 se encuentra que _WIN32 se define por lo que la prueba contra _WIN64 antes de la prueba (!) contra _WIN32 –