versiones ultima c++ gcc syntax header-files

c++ - ultima - makefile gcc



¿Qué es esta construcción de lenguaje C++:#(es decir, hash) entero "path_to_header_or_cpp_file"? (3)

Esto se produce desde el preprocesador GCC. Esas líneas son conocidas como linemarkers . Tienen la sintaxis:

# linenum filename flags

Se interpretan como diciendo que la siguiente línea proviene de la línea linenum del filename de filename . Básicamente solo te ayudan a ti y al compilador a ver de dónde se incluyeron las líneas. Las banderas proporcionan más información:

  • 1 - Esto indica el inicio de un nuevo archivo.
  • 2 - Esto indica volver a un archivo (después de haber incluido otro archivo).
  • 3 - Esto indica que el siguiente texto proviene de un archivo de encabezado del sistema, por lo que se deben suprimir ciertas advertencias.
  • 4 - Esto indica que el siguiente texto debe tratarse como envuelto en un bloque extern "C" implícito.

Puede ver este resultado de preprocesar sus propios programas si le da el -E a g ++.

Encontré el siguiente código en un archivo .cpp. No entiendo la construcción o sintaxis que involucra los archivos de encabezado. Reconozco que estos archivos de cabecera en particular se relacionan con el NDK de Android. Pero, creo que la pregunta es una pregunta general sobre la sintaxis de C ++. Estos parecen ser comandos de preprocesador de alguna manera porque comienzan con "#". Pero, no son los comandos típicos #include, #pragma, #ifndef, #define, etc. El archivo de origen tiene más de 1000+ ocurrencias de este tipo que hacen referencia a cientos de archivos diferentes .h, .c, .cpp.

typedef int __time_t; typedef int __timer_t; # 116 "/home/usr/download/android-ndk-r8b/platforms/android-3/arch-arm/usr/include/machine/_types.h" # 41 "/home/usr/download/android-ndk-r8b/platforms/android-3/arch-arm/usr/include/sys/_types.h" 2 # 33 "/home/usr/download/android-ndk-r8b/platforms/android-3/arch-arm/usr/include/stdint.h" 2 # 48 "/home/usr/download/android-ndk-r8b/platforms/android-3/arch-arm/usr/include/stdint.h" typedef __int8_t int8_t; typedef __uint8_t uint8_t;

El compilador (GCC) no parece estar lanzando ningún error relacionado con estas líneas. Pero, me gustaría entender su propósito y función. ¿Alguien puede explicar esto?


Los preprocesadores tienden a introducir estas directivas y las utilizan para indicar la línea y el nombre del archivo. El C ++ no define el significado pero se reserva el uso de

# <non-directive>

dónde Es algo que no es una de las directivas normales. Parece que las escrituras del compilador han acordado usar el número de línea y el nombre de archivo en estos como resultado del procesamiento previo del archivo. Este uso es similar a básicamente todos los compiladores que admiten la opción -E para indicar que los archivos solo deben procesarse.


Normalmente verá líneas como esa en la salida del preprocesador (es decir, normalmente no debería verlas en absoluto).

Son similares a la directiva #line estándar, que tiene la forma:

#line 42

o

#line 42 "foo.c"

que el compilador utiliza para controlar el contenido de los mensajes de error.

Sin la line la palabra, esto:

# 42 "foo.c"

técnicamente no es una directiva (lo que, para agregar a la diversión, es un tipo de directiva). Es esencialmente un comentario en lo que se refiere al estándar C En una suposición, el preprocesador de gcc probablemente emita estas directivas en lugar de #line directivas #line porque #line directivas #line están pensadas como entrada para el preprocesador.

El preprocesador de gcc se refiere a estos como "linemarkers"; se discuten linemarkers . Son tratados como directivas #line , excepto que pueden tomar un argumento de #line adicional.