¿Cuál es el significado de las líneas que comienzan con un signo de almohadilla y un número como '# 1 "ac"' en la salida del preprocesador gcc?
Imprimo la salida del preprocesador C usando
gcc -E a.c
La salida contiene muchas líneas como
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "a.c"
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 1 3
# 19 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 3
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 1 3
# 31 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 3
# 32 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 3
# 20 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 2 3
Nunca he visto este tipo de sintaxis en C. ¿Alguien puede explicar qué hace esto?
Estas líneas son sugerencias para la depuración (de dónde proviene realmente el código que sigue a la línea)
# line-number "source-file" [flags]
Significado de las banderas (separadas por espacios):
- 1 - Inicio de un nuevo archivo
- 2 - Volviendo al archivo anterior
- 3: el siguiente texto proviene de un archivo de encabezado del sistema (#include <> vs #include "")
- 4 - El texto siguiente debe tratarse como si estuviera incluido en un bloque "C" externo implícito.
Estos marcadores de línea se mencionan en man gcc
la -P
opción.
La -P
opción está destinada específicamente a eliminar estas líneas para mayor claridad:
gcc -E -P source.c
Ver documentación detallada (respondida antes).
Esas son directivas de sincronización de líneas, que permiten gcc
dar mensajes de error correctos para errores en #include
archivos d. Otros preprocesadores (como yacc
/ bison
) utilizan el mismo mecanismo para relacionar los errores de C con las líneas correctas del .y
archivo de entrada.