GNU/Linux >> Tutoriales Linux >  >> Linux

Compilación condicional en C++ basada en el sistema operativo

Mi gcc (4.3.3) define las siguientes macros predefinidas relacionadas con Linux:

$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

Bajo VC++ (y muchos otros compiladores de Win32) también hay un par de macros predefinidas que identifican la plataforma, sobre todo _WIN32. Más detalles:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx


No hay una forma estándar de hacer esto. Puede ser posible desactivar ciertas macros que se definen por plataforma. Por ejemplo, _WIN32 se definirá en Windows y casi seguro que no en Linux. Sin embargo, no conozco ninguna macro de Linux correspondiente.

Debido a que está utilizando compiladores separados, se deduce que tiene entornos de compilación separados. ¿Por qué no simplemente agregar la macro usted mismo? Tanto Visual Studio como GCC admiten la definición de macros desde la línea de comandos, así que simplemente defínalas.


Siempre trato de mantener las especificaciones de la plataforma fuera del código principal haciéndolo de esta manera

plataforma.h:

#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif

algunaclase.c:

void SomeClass::SomeFunction()
{
   system_related_type t;
   // Other code
   platform_SystemCall(&t);
   // Other code
}

Ahora en windows_platform.h y linux_platform.h escribes def system_related_type al tipo nativo, y #define platform_SystemCall como la llamada nativa, o cree una pequeña función contenedora, si el conjunto de argumentos de una plataforma a otra es demasiado diferente.

Si las API del sistema para una tarea en particular son muy diferentes entre plataformas, es posible que deba crear su propia versión de API que divida la diferencia. Pero en su mayor parte, existen asignaciones bastante directas entre las diversas API en Windows y Linux.

En lugar de confiar en algún compilador en particular #define para seleccionar la plataforma, #define BUILD_PLATFORM xxx en el archivo del proyecto o makefile, ya que de todos modos tienen que ser únicos por plataforma.


Linux
  1. Consulta tu sistema operativo Linux como una base de datos

  2. Cambiar el puerto SSH en el sistema operativo Linux Ubuntu

  3. Configurar el servidor MySQL en el sistema operativo Ubuntu

  4. ¿Cómo compruebo el sistema operativo en Python?

  5. ¿Qué es un contenedor de Linux y un hipervisor de Linux?

Redox OS:un sistema operativo escrito en Rust

Primeros pasos con el sistema operativo Linux

¿Linux es un sistema operativo o un kernel?

Encuentre detalles del sistema Linux usando Python

Windows vs MacOS vs Linux – Manual del sistema operativo

Los 10 mejores sistemas operativos basados ​​en Unix