&iquest;Cu&aacute;l es la diferencia entre #include <filename> y # incluye "nombre de archivo"</filename>

c++ c include header-files c-preprocessor


En los lenguajes de programación C y C ++, ¿cuál es la diferencia entre usar corchetes angulares y usar comillas en una declaración de include , como sigue?

  1. #include <filename>
  2. #include "filename"



Answer 1 quest49


En la práctica,la diferencia está en la ubicación en la que el preprocesador busca el archivo incluido.

Para #include <filename> el preprocesador busca de manera dependiente de la implementación, normalmente en directorios de búsqueda previamente designados por el compilador / IDE. Este método se usa normalmente para incluir archivos de encabezado de biblioteca estándar.

Para #include "filename" , el preprocesador busca primero en el mismo directorio que el archivo que contiene la directiva, y luego sigue la ruta de búsqueda utilizada para el formulario #include <filename> . Este método se usa normalmente para incluir archivos de encabezado definidos por el programador.

Una descripción más completa está disponible en la documentación de GCC en las rutas de búsqueda .




Answer 2 piCookie


La única manera de saberlo es leer la documentación de su implementación.

En el estándar C , sección 6.10.2, los párrafos 2 a 4 establecen:

  • Una directiva de preprocesamiento de la forma

    #include <h-char-sequence> new-line

    busca en una secuencia de lugares definidos por la implementación un encabezado identificado únicamente por la secuencia especificada entre los delimitadores < y > , y provoca el reemplazo de esa directiva por todo el contenido del encabezado . La forma en que se especifican los lugares o el encabezado identificado está definido por la implementación.

  • Una directiva de preprocesamiento de la forma

    #include "q-char-sequence" new-line

    provoca el reemplazo de esa directiva por todo el contenido del archivo fuente identificado por la secuencia especificada entre los " delimitadores. El archivo fuente nombrado se busca de una manera definida por la implementación. Si esta búsqueda no es compatible, o si la búsqueda falla , la directiva se vuelve a procesar como si dijera

    #include <h-char-sequence> new-line

    con la secuencia contenida idéntica (incluidos los caracteres > , si los hay) de la directiva original.

  • Una directiva de preprocesamiento de la forma

    #include pp-tokens new-line

    (que no coincide con una de las dos formas anteriores) está permitido. Los tokens de preprocesamiento después de include en la directiva se procesan como en el texto normal. (Cada identificador actualmente definido como un nombre de macro se reemplaza por su lista de reemplazo de tokens de preprocesamiento). La directiva resultante después de todos los reemplazos debe coincidir con una de las dos formas anteriores. El método por el cual una secuencia de tokens de preprocesamiento entre un par de tokens de preprocesamiento < y a > o un par de " caracteres se combina en un token de preprocesamiento de nombre de encabezado único se define en la implementación.

Definitions:

  • h-char: cualquier miembro del conjunto de caracteres de origen excepto el carácter de nueva línea y >

  • q-char: cualquier miembro del conjunto de caracteres de origen excepto el carácter de nueva línea y "




Answer 3 aib


La secuencia de caracteres entre <y> se refiere únicamente a un encabezado, que no es necesariamente un archivo. Las implementaciones son bastante libres de usar la secuencia de caracteres como lo deseen. (Sin embargo, principalmente, trátelo como un nombre de archivo y realice una búsqueda en la ruta de inclusión , como indican las otras publicaciones).

Si se usa el formulario #include "file" , la implementación primero busca un archivo con el nombre dado, si es compatible. De lo contrario (compatible), o si la búsqueda falla, la implementación se comporta como si se utilizara el otro #include <file> ( #include <file> ).

Además, existe un tercer formulario y se utiliza cuando la directiva #include no coincide con ninguno de los formularios anteriores. De esta forma, se realiza un preprocesamiento básico (como la expansión de macro) en los "operandos" de la directiva #include , y se espera que el resultado coincida con una de las otras dos formas.




Answer 4 Yann Droneaud


Algunas buenas respuestas aquí hacen referencias al estándar C pero olvidaron el estándar POSIX, especialmente el comportamiento específico del comando c99 (por ejemplo, el compilador C) .

Según el número 7 de las especificaciones básicas de The Open Group ,

-Idirectory

Cambie el algoritmo para buscar encabezados cuyos nombres no sean nombres de ruta absolutos para buscar en el directorio nombrado por el nombre de ruta del directorio antes de buscar en los lugares habituales. Por lo tanto, los encabezados cuyos nombres están entre comillas dobles ("") se buscarán primero en el directorio del archivo con la línea #include , luego en los directorios nombrados en las opciones -I , y por último en los lugares habituales. Para los encabezados cuyos nombres están encerrados entre corchetes angulares ("<>"), el encabezado se buscará solo en directorios nombrados en las opciones -I y luego en los lugares habituales. Los directorios nombrados en las opciones -I se buscarán en el orden especificado.Las implementaciones deberán soportar al menos diez instancias de esta opción en una solainvocación del comando c99 .

Por lo tanto, en un entorno compatible con POSIX, con un compilador de C compatible con POSIX, #include "file.h" probablemente buscará ./file.h primero, dónde . es el directorio donde está el archivo con el #include declaración, mientras que #include <file.h> , es probable que va a buscar /usr/include/file.h primera, donde /usr/include es su sistema define los lugares habituales para encabezados (parece que POSIX no lo define).




Answer 5 Suraj Jain


La documentación de GCC dice lo siguiente sobre la diferencia entre los dos:

Tanto los archivos de encabezado del usuario como del sistema se incluyen utilizando la directiva de preprocesamiento ‘#include’ . Tiene dos variantes:

#include <file>

Esta variante se utiliza para los archivos de encabezado del sistema. Busca un archivo llamado archivo en una lista estándar de directorios del sistema. Puede anteponer directorios a esta lista con la opción -I (ver Invocación ).

#include "file"

Esta variante se utiliza para archivos de encabezado de su propio programa. Busca un archivo llamado archivo primero en el directorio que contiene el archivo actual, luego en los directorios de comillas y luego en los mismos directorios utilizados para <file> . Puede anteponer directorios a la lista de directorios de comillas con la opción -iquote . El argumento de ‘#include’ , ya sea delimitado con comillas o corchetes angulares, se comporta como una constante de cadena en que los comentarios no se reconocen y los nombres de macro no se expanden. Por lo tanto, #include <x/*y> especifica la inclusión de un archivo de encabezado del sistema llamado x/*y .

Sin embargo, si se producen barras diagonales inversas dentro del archivo, se consideran caracteres de texto normales, no caracteres de escape. Ninguna de las secuencias de escape de caracteres apropiadas para las constantes de cadena en C se procesan. Por lo tanto, #include "x\n\\y" especifica un nombre de archivo que contiene tres barras invertidas. (Algunos sistemas interpretan '\' como un separador de nombre de ruta. Todos estos también interpretan ‘/’ la misma manera. Es más portátil usar solo ‘/’ .)

Es un error si hay algo (aparte de los comentarios)en la línea después del nombre del archivo.