viernes, 18 de febrero de 2011

C - Haciendo un codigo compatible con linux y windows

Cuando estamos haciendo un programa en C necesitamos tener en cuenta para en que sistema operativo va a ser compilado y ejecutado, porque aunque la mayoría del código valdrá indistintamente para ambos sistemas, con algunas acciones concretas que implican interactuar con el sistema operativo no ocurre así.
Un caso sería la construcción de rutas de acceso a un archivo, o un caso mucho más sencillo, hacer un limpiado de la pantalla antes de empezar a escribir, los comandos "clear" o "cls" según el sistema en el que estemos.

Existe una forma de hacerlo sin tener que reescribir lineas de código antes de compilar el programa, son las directivas, que permiten dirigir la ejecución del código en función de si está definida o no una macro.


//definición de una macro
#define __micontrol__

//si la macro está definida
#ifdef __micontrol__
    printf("%s","La macro __micontrol__ está definida");
//sino
#else
    printf("%s","La macro __micontrol__ NO está definida");
#endif


o también:


//si la macro está definida
#ifdef __micontrol__
    printf("%s","La macro __micontrol__ está definida");
#endif

//si la macro no está definida
#ifndef __micontrol__
    printf("%s","La macro __micontrol__ NO está definida");
#endif


Cuando estamos en un sistema linux, el compilador tiene predefinida una macro __linux__ o linux, según el sistema, así, comprobando la existencia o no de esa macro, sabemos en que sistema estamos ejecutando el programa, vamos a nuestro ejemplo de limpiar la pantalla:

Para no tener que preocuparnos si nuestro sistema linux tiene predefinida la macro __linux__ o la macro linux, y poder trabajar siempre con una de ellas independientemente del sistema (en este caso usar siempre __linux__), realizamos una comprobación previa, si existe linux, nosotros creamos __linux__.


#ifdef linux
    #ifndef __linux__
        #define __linux__
    #endif
#endif

void limpiarpantalla()
    {
    #ifdef __linux__
        system("clear");
    #else
        sistem("cls");
    #endif
    }


incluso podríamos ahorrarnos el crear una función y definir una macro que simplemente sería substituida a la hora de compilar:


#ifdef __linux__
    #define clrscr system("clear");
#else
    #define clrscr system("cls");
#endif


y en el código escibiríamos "clrscr;" donde fuera necesario.

No hay comentarios:

Publicar un comentario