2010-03-10 24 views
9

¿Hay una manera de hacer que el GNU C preprocesador, CPP (o alguna otra herramienta) Lista todas las macros disponibles y sus valores en un punto dado en un archivo C?ficha de C Constantes/Macros

Estoy buscando macros específicas del sistema al portar un programa que ya es unix inteligente y cargando un conjunto disperso de archivos de sistema de Unix.

Solo me pregunto si hay una manera más fácil que buscar definiciones.

+3

Una pregunta interesante ... ¿tal vez incluir tu intento te dará una mejor respuesta? – fbrereto

Respuesta

15

no sé acerca de un determinado lugar en un archivo, pero utilizando:

$ touch emptyfile 
$ cpp -dM emptyfile 

volcados todos los valores por defecto. Hacer lo mismo para un archivo C con algunas líneas #include y #define incluye todo eso también. ¿Supongo que podrías truncar tu archivo al lugar que te importa y luego hacer lo mismo?

Desde el man page:

-dCHARS
CHARS es una secuencia de uno o más de los siguientes caracteres, y no irá precedido por un espacio. Otros caracteres son interpretados por el compilador propiamente dicho o reservados para versiones futuras de GCC, por lo que se ignoran silenciosamente. Si especifica caracteres cuyo comportamiento está en conflicto, el resultado no está definido.

M
En lugar de la salida normal, generar una lista de #define directivas para todas las macros definidas durante la ejecución del preprocesador, incluyendo macros predefinidas. Esto le proporciona una forma de averiguar qué está predefinido en su versión del preprocesador. Suponiendo que no tiene ningún archivo foo.h, el comando

touch foo.h; cpp -dM foo.h 

mostrará todas las macros predefinidas.

Si utiliza -dM sin la opción -E, -dM se interpreta como sinónimo de -fdump-rtl-mach.

D
Como M excepto en dos aspectos: no incluye las macros predefinidas, y se da salida a los dos #define directivas y el resultado del procesamiento previo. Ambos tipos de salida van al archivo de salida estándar.

N
Me gusta D, pero solo emita los nombres de las macros, no sus expansiones.

I
salida #include directivas además del resultado de preprocesamiento.

+1

Simplemente curioso: ¿por qué es necesario el comando 'touch foo.h'? –

+0

@Michael, 'cpp -dM' sin un argumento de nombre de archivo espera datos en' stdin'. Podrías hacer eso y luego escribir '^ D', pero crear un archivo vacío es más fácil. –

+0

Gracias, olvidé que 'toque' era una manera fácil de crear un archivo vacío. –

0

¿Por qué no consultar la sección en Predefined-macros? ¿Necesitas esto para construir un proyecto o algo por el estilo?

+0

Sí * macros predefinidas * es una buena sección del manual de gcc, pero estoy buscando macros específicas del sistema mientras transfiero un programa que ya tiene conocimientos de Unix y cargando un conjunto disperso de archivos de sistema Unix. Solo me preguntaba si había una manera más fácil que buscar definiciones. – ZJR

0

Para una lista de "sus valores en un punto dado en un archivo C" usando macros, hay dos que pueden demostrar un punto dado en un archivo de C, especialmente cuando se compila, y se consideraría útil para el rastreo un punto de fallo ... tener en cuenta este código de ejemplo en un archivo llamado foo.c:

 
if (!(ptr = malloc(20))){ 
    fprintf(stderr, "Whoops! Malloc Failed in %s at line %d\n", __FILE__, __LINE__); 
} 

Si se utiliza esa lógica de código varias veces en este archivo, y la llamada a malloc estaba fallando, lo haría obtener esta salida:

 
Whoops! Malloc Failed in foo.c at line 25 

El número de línea sería diferente dependiendo de en qué parte de la fuente se utiliza esa lógica. Esta muestra sirve para mostrar dónde se puede usar esa macro ...

1

Con gcc, puede usar la opción "-dD" para volcar todas las definiciones de macro a stdout.

0

Aquí es una link a una página con una visión general de opciones de línea de comando para listar las macros predefinidas para la mayoría de los compiladores (gcc, clang ...).

+0

... y la respuesta siempre es "-d" Esto ha sido respondido hace 5 años, nigromante de la rtfm. Extraño el propósito de esta respuesta. – ZJR

Cuestiones relacionadas