¿Para qué sirve ifdef y endif en la importancion de librerías?

publicado por: Anonymous

Mientras veia este código vi ifdef y endif, algo que no entiendo es ¿cual es la funcion en la importanción?

#ifdef HAVE_UNISTD_H
#include 
#endif
#include "orconfig.h"

#include 
#include 

#include 
#include 
#include 
#ifdef HAVE_UNISTD_H
#include 
#endif

Entiendo que es una condicion , pero en ningun libro de C que he leido o comenta sobre esta condicion “ifdef y endif” en las importanciones de codigo en c ? hasta se me hizo raro porque jamas lo e visto en otro lenguaje (java,php,etc )

repositorio del código:

TOR

solución

#ifdef es una instrucción de preprocesador, es decir se ejecutar antes de compilar tu aplicación o libreria. Por ejemplo la utilidad de esa instrucción en particular es para escorger ciertas caracteristicas de la libreria se habiliten.

Esto se da porque quizas la libreria no es estandar y no este soportada, por lo que al momentor de compilar en algunas máquinas no funcionaria.

Otro uso común es cuando quieres crear una libreria multiplataforma, en donde cada OS tiene un backend especifico, por lo que al momento de compilar necesitas importar las librerias de acuerdo al OS.

Por ejemplo:

#ifdef es windows
#include <some_libraries_for_windows>
#else
#include <some_libraries_for_linux>
#endif

Otro uso que se le da es por ejemplo para habilitar un modo debug, es decir habilitamos ciertos printf en el modo depuracion, pero lo podemos eliminar en el modo release.

Cuando compilas un proyecto, en la etapa de enlazado, se copian solo las partes habilitadas, dandonos una forma versatil de manejar el proyecto.

Hare una breve traducción de una respuesta a una pregunta similar en SO en ingles:

El preprocesador dejará o eliminará el texto dentro de un par ifdef /
endif o ifndef / endif dependiendo de la condición. ifdef significa
“si se define lo siguiente” mientras que ifndef significa “si lo
siguiente no está definido”.

Como comento Daniel Pérez, tambien sirven como guardas para evitar múltiples importaciones.

Ejemplo:

#ifndef __STDIO_H
  #define __STDIO_H
  ....
  typedef struct {
    ...
  } FILE;
  ...
#endif    // __STDIO_H
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *