Pregunta ¿Cuál es la diferencia entre #include y #include "filename"?


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

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

1809
2017-08-22 01:40


origen


Respuestas:


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

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

por #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 #include <filename> formar. Este método normalmente se usa para incluir archivos de encabezado definidos por el programador.

Una descripción más completa está disponible en el CCG documentación sobre rutas de búsqueda.


1045
2017-08-22 01:40



La única forma de saber es leer la documentación de su implementación.

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

  • Una directiva de preprocesamiento de la forma

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

    busca una secuencia de lugares definidos por la implementación para un encabezado identificado únicamente por la secuencia especificada entre el < y > delimitadores, y provoca la sustitución de esa directiva por todo el contenido del encabezado. Cómo 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 la sustitución de esa directiva por todo el contenido del archivo de origen identificado por la secuencia especificada entre el " 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 se leyera

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

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

  • Una directiva de preprocesamiento de la forma

    #include pp-tokens new-line
    

    (que no coincide con ninguna de las dos formas anteriores) está permitido. Los tokens de preprocesamiento después include en la directiva se procesan igual que en el texto normal. (Cada identificador actualmente definido como 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 < y un > preprocesamiento de par de tokens o un par de " los caracteres se combinan en un único token de preprocesamiento de nombre de encabezado definido por la implementación.

Definiciones:

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

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


594
2017-09-16 21:06



La secuencia de caracteres entre <y> se refiere únicamente a un encabezado, que no es necesariamente un archivo. Las implementaciones son más o menos libres de usar la secuencia de caracteres como lo deseen. (En su mayoría, sin embargo, simplemente trátelo como un nombre de archivo y realice una búsqueda en el incluir camino, como dicen los otros mensajes.)

Si el #include "file" se utiliza el formulario, la implementación primero busca un archivo del nombre de pila, si es compatible. Si no (compatible), o si la búsqueda falla, la implementación se comporta como si la otra (#include <file>) se utilizó la forma.

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


214
2017-09-08 17:43



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

De acuerdo a Las especificaciones de base de grupo abierto, edición 7,

-YO  directorio

Cambie el algoritmo para buscar encabezados cuyos nombres no sean rutas absolutas para buscar en el directorio nombrado por el directorio nombre de ruta 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 el #incluir línea, luego en directorios nombrados en -YO opciones, y duran en los lugares habituales. Para los encabezados cuyos nombres están encerrados entre corchetes angulares ("<>"), el encabezado se buscará solo en directorios nombrados en -YO opciones y luego en los lugares habituales. Directorios nombrados en -YO las opciones se buscarán en el orden especificado. Las implementaciones deberán soportar al menos diez instancias de esta opción en un único c99 invocación de comando.

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


92
2017-07-20 09:29



Lo hace:

"mypath/myfile" is short for ./mypath/myfile

con . siendo el directorio del archivo donde el #include está contenido en, y / o el directorio de trabajo actual del compilador, y / o el default_include_paths

y

<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile

Si ./ es en <default_include_paths>, entonces no hace la diferencia.

Si mypath/myfile está en otro directorio de inclusión, el comportamiento no está definido.


36
2018-02-08 11:45



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

Los archivos de cabecera del usuario y del sistema se incluyen utilizando la directiva de preprocesamiento ‘#include’. Tiene dos variantes:

#include <file>

Esta variante se usa para archivos de cabecera del sistema. Busca un archivo denominado archivo en una lista estándar de directorios del sistema. Puede anteponer directorios a esta lista con el -I opción (ver Invocación)

#include "file"

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

Sin embargo, si se producen barras inclinadas 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 procesa. Así,#include "x\n\\y"especifica un nombre de archivo que contiene tres barras diagonales inversas. (Algunos sistemas interpretan '\' como un separador de ruta de acceso. Todos estos también interpretan ‘/’ de la misma manera. Es más portátil para usar solo ‘/’.)

Es un error si hay algo (que no sean comentarios) en la línea después del nombre del archivo.


30
2018-01-14 04:52



los <file> include le dice al preprocesador que busque en -I directorios y en directorios predefinidos primero, luego en el directorio del archivo .c los "file" include le dice al preprocesador que busque en el directorio del archivo fuente primero, y luego volver a -I y predefinido Todos los destinos se buscan de todos modos, solo el orden de búsqueda es diferente.

La norma 2011 principalmente analiza los archivos de inclusión en "16.2 Inclusión del archivo de origen".

2 Una directiva de preprocesamiento de la forma

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

busca una secuencia de lugares definidos por la implementación para un encabezado identificado únicamente por el   secuencia especificada entre los delimitadores <y>, y causa   reemplazo de esa directiva por todo el contenido del encabezado.   Cómo se especifican los lugares o se identifica el encabezado   Implementado-definido.

3 Una directiva de preprocesamiento de la forma

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

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

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

con la secuencia contenida idéntica (incluyendo> caracteres, si corresponde) de la directiva original.

Tenga en cuenta que "xxx" la forma se degrada a <xxx> forma si el archivo no se encuentra. El resto está definido por la implementación.


23
2017-09-03 12:17



Según el estándar, sí, son diferentes:

  • Una directiva de preprocesamiento de la forma

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

    busca una secuencia de lugares definidos por la implementación para un encabezado identificado únicamente por la secuencia especificada entre el < y > delimitadores, y provoca la sustitución de esa directiva por todo el contenido del encabezado. Cómo 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 la sustitución de esa directiva por todo el contenido del archivo de origen identificado por la secuencia especificada entre el " 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 se leyera

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

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

  • Una directiva de preprocesamiento de la forma

    #include pp-tokens new-line
    

    (que no coincide con ninguna de las dos formas anteriores) está permitido. Los tokens de preprocesamiento después include en la directiva se procesan igual que en el texto normal. (Cada identificador actualmente definido como 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 < y un > preprocesamiento de par de tokens o un par de " los caracteres se combinan en un único token de preprocesamiento de nombre de encabezado definido por la implementación.

Definiciones:

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

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

Tenga en cuenta que la norma no indica ninguna relación entre los modales definidos por la implementación. El primer formulario busca de una manera definida por la implementación y el otro de una manera definida por la implementación (posiblemente otra). El estándar también especifica que ciertos archivos de inclusión deben estar presentes (por ejemplo, <stdio.h>)

Formalmente, tendrías que leer el manual de tu compilador, aunque normalmente (por tradición) #include "..." formulario busca en el directorio del archivo en el que #include fue encontrado primero, y luego los directorios que #include <...> búsquedas de formulario (la ruta de inclusión, por ejemplo, encabezados de sistema).


16
2017-08-18 06:21