2010-04-11 14 views
13

¿Hay alguna manera de ejecutar el preprocesador GCC, pero solo para las macros definidas por el usuario?Ejecute un preprocesador "ligero" para GCC

Tengo algunos line-one y algunos #ifdef, etc. condicionales, y quiero ver cómo se ve mi código cuando se amplían.

Como es, el conseguir ampliada incluye, a su vez mi fprintf(stderr) s en fprintf(((__getreeent())->_stderr), etc.

Respuesta

14

llamada cpp directamente, por ejemplo,

$ cat >foo.c <<EOF 
#define FOO 
#ifdef FOO 
foo is defined 
#else 
foo is not defined 
#endif 
EOF 

$ cpp foo.c 
# 1 "foo.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "foo.c" 


foo is defined 

Por supuesto, si incluye cualquier encabezado, se incluirán en la salida. Una forma de evitar eso podría ser simplemente grep -v fuera de las líneas con #include s (o tal vez solo con #include < y permitir #include "). O bien, podría especificar la opción -nostdinc para eliminar solo las inclusiones estándar (pero posiblemente las deje en las bibliotecas locales a menos que especifique rutas de acceso para que no se encuentren); sin embargo, esto podría advertir sobre la ausencia de encabezados.

Editar: O utilice el preprocesador para hacer la inclusión de encabezados condicional, envuélvalos en algo como #ifndef TESTING_PREPROCESSOR y use -DTESTING_PREPROCESSOR.

+2

+1 - El consejo para poner las líneas '# include' en un' # if' sección es una de esas cosas simples pero eficaces que Es posible que no se le ocurra a alguien hasta que se desperdicie un montón de otros esfuerzos intentando otras cosas más complicadas. –

3
cpp -nostdinc program.c 
1
gcc -E inputfile.c > outputfile.c 

outputfile.c tendrá su código preprocesado, pero será ampliado todas las macros.

Este truco me resulta muy útil cuando se depura la compilación de sistemas grandes con toneladas de inclusiones, indicadores de compilación y variables de archivos MAKE. Expondrá archivos incluidos que no tienen protectores de encabezado y muchos otros problemas también.

+1

¿No es solo la forma estándar de ejecutar el preprocesador? ¿Cómo responde esto la pregunta? Es de suponer que el OP quiere un comportamiento no estándar (?). –

+0

Esta es la forma estándar. Si su programa es pesado en macros definidas por el usuario, y enciende macros no definidos por el usuario, entonces las macros definidas por el usuario serán fáciles de detectar. ejecutando un diff de inputfile.c y outputfile.c. En muchos casos, gcc -E es lo suficientemente bueno, aunque definitivamente perfecto para detectar "solo" macros definidas por el usuario. Y es mucho más rápido que usar los métodos perfectos descritos en otras respuestas. –

2

Uno puede utilizar herramientas como unifdef, unifdefall - eliminar condicionales del preprocesador de código

Cuestiones relacionadas