2012-02-22 13 views
8

Tengo un archivo C que necesita un archivo de encabezado específico. Si ese archivo de encabezado no existe, quiero que el preprocesador emita una advertencia específica. Algo así como:¿Puede el preprocesador C detectar si no se puede encontrar un archivo de encabezado y emitir una advertencia específica?

#if !(#include <special.h>) 
#warning "Don't worry, you can fix this." 
#warning "You just need to update this other repo over here:" 
#endif 

Es esto posible con la C preprocesador?

+0

Es posible en un archivo makefile. –

+2

generalmente haces eso con un script './Configure' –

+0

posible duplicado de [¿Se puede usar 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

9

Siempre se puede comprobar si el #define X macro, desde el archivo incluido, es definido ... :)

+1

¿Y cómo ayuda? – asaelr

+0

@asaelr No estoy seguro de si esto es cierto para todos, pero en mi configuración de compilación el PP/CC seguirá valientemente si no puede encontrar un archivo de inclusión. Entonces '#include ' seguido de '#ifndef __SPECIAL_H__' funciona para mí –

7

No, esto no es posible. Todo lo que puede hacer es intentar #include el encabezado, y si no existe, el compilador le dará un error.

Una alternativa sería usar una herramienta como GNU autoconf. autoconf genera un script de shell llamado configure que analiza su sistema de compilación y determina si tiene o no ciertos archivos de encabezado instalados, y genera un archivo de encabezado que consiste en macros que indican esa información.

Por ejemplo, se podría definir HAVE_SYS_TIME_H si su sistema de construcción incluye la cabecera <sys/time.h>, por lo que se puede escribir código como:

#if HAVE_SYS_TIME_H 
#include <sys/time.h> 
#else 
#warning "Don't worry, you can fix this." 
#endif 
+1

yepp, pero tiene más sentido emitir la advertencia/error del script de configuración ... –

-3

Si todo lo que necesita es una advertencia de que el archivo de cabecera no está allí (y sin código personalizado), la mayoría de los compiladores ya le darán uno.

$ LC_MESSAGES=en_US gcc -c bar.c 
bar.c:1:17: fatal error: foo.h: No such file or directory 
compilation terminated. 
+6

Entonces, un error fatal y una advertencia son más o menos los mismos Lo mismo para ti, ¿verdad? –

12

Sé que esta es una pregunta antigua, pero también necesitaba una forma de hacerlo y me decepcionó cuando leí estas respuestas. Resulta que sonido metálico tiene un bonito __has_include("header name") directiva que funciona a la perfección para hacer lo que usted necesita :) Tal vez usted quiere comprobar si la directiva está disponible llamando primero #if defined(__has_include)

+5

[gcc también tiene esto] (https://gcc.gnu.org/gcc-5/changes.html). Dice gcc 5, pero 4.9 parece funcionar bien para mí. –

Cuestiones relacionadas