2012-07-19 4 views
6

Supongamos que defino BAR en foo.h. Pero foo.h podría no existir. ¿Cómo lo incluyo, sin que el compilador se queje de mí?¿Cómo se incluye un archivo de encabezado que puede existir o no?

#include "foo.h" 

#ifndef BAR 
#define BAR 1 
#endif 

int main() 
{ 
    return BAR; 
} 

Por lo tanto, si BAR se definió como 2 en foo.h, entonces el programa volvería 2 si existe foo.h y 1 si foo.h no existe.

+0

Proporcione su propio respaldo foo.h que define 'BAR', y configure la ruta de búsqueda del compilador en consecuencia? –

+0

Supongo que podría hacer eso. ¿Por qué la caída de foo.h necesita incluir algo? – theanine

+0

posible duplicado de [¿Se puede utilizar el preprocesador C para saber si existe un archivo?] (Http://stackoverflow.com/questions/142877/can-the-c-preprocessor-be-used-to-tell-if- a-file-exists) –

Respuesta

8

En general, deberá hacer algo externo para hacer esto, p. Ej. haciendo algo así como jugar con la ruta de búsqueda (como se sugiere en los comentarios) y proporcionando foo.h vacío como una reserva, o envolviendo #include dentro de #ifdef HAS_FOO_H ... #endif y configurando HAS_FOO_H mediante un interruptor de compilación (-DHAS_FOO_H para gcc/clang etc.).

Si sabe que está utilizando un compilador en particular, y la portabilidad no es un problema, tenga en cuenta que algunos compiladores admiten incluir un archivo que puede existir o no, como una extensión. Por ejemplo, vea la característica __has_include de clang.

+0

El segundo archivo de respaldo foo.h es la solución más simple. – theanine

+1

También es una mala solución porque si el 'foo.h' real cambia su protector de cabecera interno' # define', se obtiene una rotura sutil. –

+1

¿Por qué? El refugio foo.h está vacío. – theanine

6

Use una herramienta como GNU Autoconf, para eso está diseñada. (En Windows, es posible que prefiera usar CMake).

Así que en su configure.ac, tendría una línea como:

AC_CHECK_HEADERS([foo.h]) 

cual, después de ejecutar configure, definiría HAVE_FOO_H, que se puede probar de esta manera:

#ifdef HAVE_FOO_H 
#include "foo.h" 
#else 
#define BAR 1 
#endif 

Si La intención es ir por la ruta autotools (que es autoconf y automake, porque funcionan bien juntos), le sugiero que comience con este excellent tutorial.

+0

Autotools puede ser ... bueno, doloroso, y es completamente innecesario en estos días. Mac y Linux tienen una excelente compatibilidad con CMake, y hay otros buenos sistemas de compilación (como [SCons] (http://www.scons.org/)). ESR tiene una publicación particularmente conmovedora que vale la pena considerar: [Las autotools deben morir] (http://esr.ibiblio.org/?p=1877). – sfstewman

+4

El dolor que CMake inflinge supera con creces las autotools '. http://news.ycombinator.com/item?id=2357014. Impone un modelo de compilación inspirado en MSVC a unix land, viene con un nuevo y torpe lenguaje de programación al que le faltan estructuras de datos adecuadas, extendido de forma ad hoc con elementos aleatorios incorporados (qt4 !? fltk !?). La queja de ESR es todo vitriolo y nada de sustancia. He usado CMake, SCons y autotools en varios proyectos y voy a usar autotools casi todo el tiempo. Para reemplazar autotools, no necesita compilar para makefiles. El modelo de 'make' se rompe sutilmente y un reemplazo debe entender eso. –

Cuestiones relacionadas