2011-07-12 33 views
17

Me gustaría pasar el nombre de un archivo de inclusión como un argumento de compilación para poder modificar una gran cantidad de parámetros de configuración. Sin embargo, mi compilación en C++ se realiza a través de un proceso similar a un makefile que elimina las comillas de los argumentos pasados ​​al compilador y al preprocesador. Tenía la esperanza de hacer algo equivalente aAgregar comillas al argumento en el preprocesador de C++

#ifndef FILE_ARG 
// defaults 
#else 
#include "FILE_ARG" 
#endif 

con mi línea de comandos que incluye -DFILE_ARG = foo.h. Por supuesto, esto no funciona, ya que el preprocesador no traduce FILE_ARG.

He intentado

#define QUOTE(x) #x 
#include QUOTE(FILE_ARG) 

que no funciona por la misma razón.

Por razones de secuencias de comandos, prefiero hacer esto en la línea de comandos que entrar y editar una línea de incluir en la rutina adecuada. ¿Hay alguna manera?

Respuesta

24

Para añadir presupuestos que necesitan este truco:

#define Q(x) #x 
#define QUOTE(x) Q(x) 

#ifdef FILE_ARG 
#include QUOTE(FILE_ARG) 
#endif 
+0

Dado que FILE_ARG no tiene comillas, la primera no funciona porque include espera comillas o <>. –

+0

lo siento, probado con #define incorrecta. arreglado. –

+1

Parece que funciona. ¿Por qué el doble define? –

0

funciona para mí. ¿Quizás olvidó citar correctamente en su Makefile?

 
$ cat example.c 
#include FILE_ARG 

$ cat test.h 
#define SOMETHING 

$ gcc -Wall -Wextra -W -DFILE_ARG=\"test.h\" -c example.c 
$ 

EDIT: La razón por la que no podría ser capaz de obtener citando al trabajo se debe a que el preprocesador trabaja en phases. Además, utilicé "gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2", los resultados pueden variar entre compiladores.

+0

Como dije antes, no tengo acceso a la línea de comando real. Mi archivo MAKE elimina citas de argumentos. –

1

También puede probar el parámetro -include.

manual de gcc:

archivo -include

archivo de proceso como si #include "archivo" apareció como la primera línea del archivo fuente primaria. Sin embargo, el primer archivo de búsqueda de directorio es el directorio de trabajo del preprocesador en lugar del directorio que contiene el archivo fuente principal. Si no se encuentra allí, se busca para el resto de la cadena de búsqueda # ... "..." de forma normal. Si se proporcionan varias opciones de inclusión, los archivos se incluyen en el orden en que aparecen en la línea de comandos. *

4

Usted puede hacer

#ifdef FILE_ARG 
#include FILE_ARG 
#endif 

En la línea de comandos

$ gcc -DFILE_ARG="\"foo.h\"" ... 

debe hacer el truco.

+0

Es más simple usar '-DFILE_ARG = '" foo.h "'' con comillas simples en lugar de comillas dobles invertidas ... –