2011-05-24 19 views
11

Estoy escribiendo una aplicación C++ portátil. ¿Cómo incluyo diferentes encabezados basados ​​en el sistema operativo en el que se ejecuta? ¿Hay alguna manera de hacer esto en C++ o tengo que usar el sistema de compilación?¿Cómo incluyo diferentes encabezados basados ​​en mi sistema operativo?

+0

Allí, lo hizo. Gracias por recordarme. – roshanvid

+0

De nada. Pero * por favor * haz esto en el sistema de construcción, hará que tu software sea mucho más fácil de mantener. Si los módulos no se pueden escribir de una manera independiente de la plataforma (a menudo pueden, especialmente con bibliotecas como Boost o Qt), entonces diseñe sus propias abstracciones sobre las instalaciones del sistema operativo e impleméntelas varias veces. –

+0

Todas buenas respuestas. Lo siento si digo lo obvio, pero tenga en cuenta que, en general, es una buena idea favorecer encabezados y bibliotecas que son multiplataforma. Siempre que la [Biblioteca estándar de C++] (http://en.wikipedia.org/wiki/C%2B%2B_standard_library) tenga lo que necesita, pregúntese por qué elegiría una alternativa. –

Respuesta

10

con preprocesador:

#ifdef _SUNOS 
//code 
#elseif _LINUX 
//code 
#elseif _HPUX 
//code 
#elseif _WIN32 
//code 
#else 
#error OS not supported 
#endif 
+0

Aquí hay una [lista de macros predefinidas] (http://predef.sourceforge.net/preos.html). – roshanvid

+0

@ c0smikdebris: gracias :) – BlackBear

+0

Tenga en cuenta que _WIN32 se define tanto en Windows de 32 bits como en Windows de 64 bits. – user763305

4

Desarrollamos en Linux (Red Hat Enterprise 5), Sun (Solaris) y Windows. Nuestro sistema es usar algo como esto:

#ifndef MSWINDOWS 
#include <unistd.h> 
#else 
#include <winbase.h> 
#endif 
//More includes here 
8

Me gustaría utilizar las directivas del preprocesador y un sistema de construcción de plataforma cruzada como CMake. Se podría hacer:

#ifdef LINUX 
#include <unistd.h> 
#elif defined(WINDOWS) 
#include <algorithm.h> 
# elif Defined(MAC_OSX) 
//... etc. 
#else 
#error No operating system defined 
#endif 

A continuación, agregue la bandera preprocesador correspondiente a la construcción, tales como: -DLINUX.

+0

Creo que esta es una buena idea. Últimamente intenté hacer esto usando las definiciones usadas por los compiladores, pero me di por vencido, hay tantas variaciones y otras cosas. Me resultó más fácil usar mi propia definición, establecida por el sistema de compilación. – Skurmedel

Cuestiones relacionadas