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

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

  • #include <filename>
  • #include "filename"
1937
22 авг. set quest49 22 ago. 2008-08-22 04:40 '08 a las 4:40 2008-08-22 04:40
@ 32 respuestas
  • 1
  • 2

En la práctica, la diferencia es que el preprocesador busca el archivo incluido.

Para #include <filename> preprocesador realiza una búsqueda basada en la implementación, generalmente en directorios de búsqueda previamente asignados por el compilador / IDE. Este método se utiliza normalmente para incluir archivos de encabezado de biblioteca estándar.

Para #include "filename" 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 generalmente para incluir archivos de encabezado definidos por el programador.

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

1127
22 авг. La respuesta se da quest49 22 ago. 2008-08-22 04:40 '08 a las 4:40 2008-08-22 04:40

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

La norma C , sección 6.10.2, cláusulas 2-4 establece:

  • Directiva del pre-tratamiento de la forma.

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

    busca una secuencia de lugares definidos por la implementación para un encabezado que se identifica de forma única por la secuencia especificada entre los delimitadores < y > , y hace que esta directiva se reemplace con todos los contenidos del encabezado . La implementación determina cómo se determinan los lugares o cómo se determina el título.

  • Directiva del pre-tratamiento de la forma.

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

    hace que esta directiva se reemplace con el contenido completo del archivo fuente, identificado por la secuencia especificada entre delimitadores. El archivo fuente nombrado se busca en un método definido por la implementación. Si esta búsqueda no es compatible o si la búsqueda falla, la directiva se procesa como si se estuviera leyendo.

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

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

  • Directiva del pre-tratamiento de la forma.

     #include pp-tokens new-line 

    (Lo que no corresponde a uno de los dos formularios anteriores) está permitido. Los tokens de preprocesamiento después de include en la directiva se procesan de la misma manera que en texto sin formato. (Cada identificador actualmente definido como nombre de macro se reemplaza con su lista de listas de sustitución de token de preprocesamiento). La directiva resultante de todos los reemplazos debe corresponder a uno de los dos formularios anteriores. El método mediante el cual la secuencia de marcadores de preprocesamiento entre un < y > y los marcadores de preprocesamiento de un par o un par de caracteres se combina en un nombre del encabezado de los marcadores de preprocesamiento depende de la implementación.

Definiciones:

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

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

622
17 сент. La respuesta se da piCookie 17 sep . 2008-09-17 00:06 '08 a las 0:06 2008-09-17 00:06

La secuencia de caracteres entre <y> se refiere exclusivamente al encabezado, que no es necesariamente un archivo. Las implementaciones son en gran parte libres de usar una cadena de caracteres como mejor le parezca. (Básicamente, sin embargo, simplemente trátelo como un nombre de archivo y busque la ruta de inclusión, ya que el resto del mensaje indica).

Si #include "file" el formulario #include "file" , la implementación primero busca un archivo con el nombre especificado, si es compatible. Si no (compatible) o si la búsqueda no se realiza, la implementación se comporta como si se utilizara otro formulario ( #include <file> ).

Además, hay un tercer formulario y se usa cuando la directiva #include no coincide con ninguno de los formularios anteriores. En esta forma, se realiza algún preprocesamiento básico (por ejemplo, expansión de macros) en los operandos de la directiva #include , y se espera que el resultado corresponda a una de las otras dos formas.

242
08 сент. respuesta dada aib 08 sep. 2008-09-08 20:43 '08 a las 8:43 pm 2008-09-08 20:43

Algunas respuestas correctas aquí contienen referencias al estándar C, pero se olvida el estándar POSIX, especialmente el comportamiento específico del comando c99 (por ejemplo, el compilador C) .

Según las Especificaciones Originales del Grupo Abierto No. 7 ,

-I

Modifique el algoritmo de búsqueda para los encabezados cuyos nombres no sean rutas absolutas, para buscar en el directorio indicado por la ruta del directorio, antes de buscar en los lugares habituales. Por lo tanto, los encabezados cuyos nombres aparecen entre comillas dobles (") se buscan primero en el directorio de un archivo con la línea #include , y luego en los directorios con el nombre -I , y los últimos en lugares normales. Para los encabezados que tienen nombres entre corchetes angulares ("<>"), el título debe buscarse solo en los directorios nombrados en los parámetros -I y luego en lugares normales. Los directorios nombrados en los parámetros -I deben encontrarse en el orden especificado. Las implementaciones deben admitir al menos diez instancias de esta opción en una llamada al comando c99.

Por lo tanto, en un entorno compatible con POSIX, con un compilador de COS compatible con C, #include "file.h" probablemente buscará primero ./file.h , dónde . - este es el directorio donde se encuentra el archivo con la instrucción #include mientras que #include <file.h> probablemente buscará /usr/include/file.h primero, donde /usr/include es su sistema Lugares para encabezados (no está definido por POSIX).

98
20 июля '12 в 12:29 2012-07-20 12:29 Yann Droneaud dio la respuesta el 20 de julio de '12 a las 12:29 2012-07-20 12:29

El hace

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

c . es el directorio del archivo que contiene #include y / o el directorio de trabajo actual del compilador, y / o default_include_paths

y

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

Si ./ está en <default_include_paths> , entonces no importa.

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

39
08 февр. La respuesta la da Stefan Steiger 08 feb. 2011-02-08 14:45 '11 a las 14:45 2011-02-08 14:45

La documentación de GCC establece la diferencia entre ellos:

Los archivos de encabezado del usuario y del sistema se incluyen utilizando la directiva de preprocesamiento '#include . Tiene dos opciones:

#include <file>

Esta opción se utiliza para los archivos de encabezado del sistema. Busca un archivo denominado archivo en la lista estándar de directorios del sistema. Puede agregar directorios a esta lista con las opciones -I (consulte Invocación ).

#include "file"

Esta opción se utiliza para los archivos de encabezado de su propio programa. Busca un archivo llamado file primero en el directorio que contiene el archivo actual, luego en directorios de citas, y luego en los mismos directorios que para <file> . Puede agregar directorios a la lista de directorios de -Iquote con -Iquote . El argumento '#include , delimitado por 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 extienden. Por lo tanto, #include <x/*y> indica la inclusión de un archivo de encabezado del sistema llamado x/*y .

Sin embargo, si se producen barras invertidas dentro de un archivo, se consideran caracteres de texto sin formato, no caracteres de escape. No se procesa ninguna de las secuencias de control de los caracteres correspondientes a las constantes de cadena en C. Por lo tanto, #include "x\n\\y" indica el nombre del archivo que contiene tres barras invertidas. (Algunos sistemas interpretan '\ como un delimitador de ruta. También interpreta '/ de la misma manera. Sólo '/ más portátil.)

Esto es un error si hay algo (excepto comentarios) en la línea después del nombre del archivo.

38
14 янв. La respuesta la da Suraj Jain el 14 de enero. 2017-01-14 07:52 '17 a las 7:52 2017-01-14 07:52

<file> include le indica al preprocesador que busque en los directorios -I y en los directorios predefinidos primero , y luego en el archivo .c del directorio. "file" include le dice al preprocesador que busque primero el directorio del archivo fuente, luego regresa a -I y está predefinido. En cualquier caso, todos los destinatarios son buscados, solo el orden de búsqueda es diferente.

El estándar de 2011 trata principalmente los archivos incluidos en "16.2 Archivo de fuente de entrada".

2 Directiva de preprocesamiento de formularios.

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

realiza una búsqueda de una secuencia de lugares definidos para la implementación del encabezado, identificó de forma única la secuencia especificada entre delimitadores <and> y llama a reemplazar esta directiva con todo el contenido del encabezado. Según lo indicado por el lugar o identificado por el título de la implementación.

3 Formulario de Directiva de Pre-procesamiento

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

hace que esta directiva se reemplace con el contenido completo del archivo fuente identificado por la secuencia especificada entre "delimitadores". La búsqueda del archivo fuente con nombre se realiza de acuerdo con la implementación. Si esta búsqueda no es compatible, o si la búsqueda no se realiza, la directiva se procesa como si leyera

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

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

Tenga en cuenta que el formulario "xxx" deteriora al formulario <xxx> si no se encuentra el archivo. El resto está determinado por la implementación.

27
03 сент. La respuesta se da Arkadiy 03 sep. 2008-09-03 15:17 '08 a las 3:17 pm 2008-09-03 15:17

Por norma - sí, son diferentes:

  • Formulario de directiva anticipada

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

    busca una secuencia de ubicaciones definidas para el encabezado, identificada por una secuencia especificada de forma única entre los delimitadores < y > , y hace que esta directiva se reemplace con el contenido completo del encabezado. Según lo indicado por la ubicación o el encabezado identificado está determinado por la implementación.

  • Formulario de directiva anticipada

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

    hace que esta directiva se reemplace con todo el contenido del archivo de origen identificado por la secuencia especificada entre delimitadores " . El archivo de origen con nombre se ejecuta en el método de búsqueda. Si esta búsqueda no es compatible o si la búsqueda no se realiza, la directiva se procesa como si leyera

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

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

  • Formulario de directiva anticipada

     #include pp-tokens new-line 

    (que no corresponde a una de las dos formas anteriores). Las corrientes de preprocesamiento después de la include en la directiva se procesan de la misma manera que en texto sin formato. (Cada identificador actualmente definido como nombre de macro se reemplaza con su lista de sustitución de token de preprocesamiento). La directiva recibida después de todos los reemplazos debe corresponder a uno de los dos formularios anteriores. El método mediante el cual una secuencia de tokens de preprocesamiento entre pares de tokens de preprocesamiento < o pares de caracteres " combina en un encabezado, el token de preprocesamiento está determinado por la implementación.

Definicion

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

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

Tenga en cuenta que el estándar no indica ninguna conexión entre las formas definidas por la implementación. La primera forma se realiza de una manera, y la otra de una manera (posiblemente diferente) de implementación. El estándar también establece que algunos archivos incluidos deben estar presentes (por ejemplo, <stdio.h> ).

Formalmente, deberá leer el manual de su compilador, pero generalmente (por tradición) el formulario #include "..." busca el directorio del archivo en el que se encontró primero #include , y luego los directorios en los que #include <...> búsqueda de formulario (incluida la ruta, por ejemplo, encabezados del sistema).

18
18 авг. respuesta dada por skyking 18 ago. 2015-08-18 09:21 '15 a las 9:21 AM 2015-08-18 09:21

Gracias por las grandes respuestas, especialmente. Adam Stelmashchik y PiKuki ibyb.

Como muchos programadores, utilicé un acuerdo no oficial para usar el "myApp.hpp" para aplicaciones específicas y el <libHeader.hpp> para los archivos de la biblioteca del sistema y el compilador, es decir, los archivos especificados en /I y la variable de entorno INCLUDE , para muchos Años pensando que esta es la norma.

Sin embargo, el estándar C establece que el orden de búsqueda es específico de la implementación, lo que puede hacer que la portabilidad sea compleja. Peor aún, usamos jam, que determina automáticamente dónde están los archivos de inclusión. Puedes usar rutas relativas o absolutas para tus archivos incluidos. eso es

 #include "../../MyProgDir/SourceDir1/someFile.hpp" 

Las versiones anteriores de MSVS requieren una doble barra invertida (\\), pero esto ya no es necesario. No sé cuándo cambió eso. Simplemente use barras diagonales para compatibilidad con nix (Windows aceptará esto).

Si está realmente preocupado por esto, use "./myHeader.h" para el archivo incluido en el mismo directorio que el código fuente (mi proyecto actual, muy grande, tiene varios duplicados de los nombres de archivo incluidos, que están muy dispersos sobre la administración de la configuración) .

Aquí la explicación de MSDN se copia aquí para su conveniencia).

Forma citada

El preprocesador busca los archivos incluidos en el siguiente orden:

  • En el mismo directorio que el archivo que contiene el operador #include.
  • En los directorios de archivos abiertos se incluye en el orden inverso en el que se abrieron. La búsqueda comienza en el directorio del archivo de inclusión padre y
    Continúa subiendo los directorios de cualquier abuelo, incluidos los archivos.
  • En la ruta especificada por cada opción del compilador /I .
  • A lo largo de la ruta establecida por la variable de entorno INCLUDE .

Forma de soporte de ángulo

El preprocesador busca los archivos incluidos en el siguiente orden:

  • En la ruta especificada por cada opción del compilador /I .
  • Cuando se compila en la línea de comando, las rutas especificadas por la variable de entorno INCLUDE .
14
15 окт. respuesta dada riderBill 15 oct. 2014-10-15 02:51 '14 a las 2:51 2014-10-15 02:51

Al menos para la versión de GCC <= 3.0, la forma del corchete angular no crea una relación entre el archivo incluido y el incluido.

Por lo tanto, si desea generar reglas de dependencia (usando el ejemplo de GCC-M para un ejemplo), debe usar el formulario entre comillas para los archivos que deben incluirse en el árbol de dependencia.

(consulte http://gcc.gnu.org/onlinedocs/cpp/Invocation.html )

13
25 окт. Respuesta dada por Denis Ros el 25 de octubre. 2011-10-25 15:35 '11 a las 15:35 2011-10-25 15:35

Para #include "" compilador #include "" generalmente busca una carpeta con un archivo que lo contiene, y luego otras carpetas. Para #include <> compilador no busca la carpeta actual con el archivo.

12
08 февр. La respuesta es dada por Maxim Egorushkin 08 Feb. 2011-02-08 14:45 '11 a las 14:45 2011-02-08 14:45

#include <file.h> le dice al compilador que busque un encabezado en su directorio de file.h , por ejemplo, para MinGW, el compilador buscará el file.h en C: \ MinGW \ include \ o donde sea que esté instalado su compilador.

#include "file" le dice al compilador que busque el directorio actual (es decir, el directorio que contiene el archivo de origen) para el file .

Puede usar el indicador -I para que GCC informe que cuando se encuentra con paréntesis angulares, también debe buscar los encabezados en el directorio después de -I . GCC se referirá al directorio después de la bandera, como si fuera un directorio.

Por ejemplo, si tiene myheader.h en su propio directorio, puede decir #include <myheader.h> si llamó a GCC con la #include <myheader.h> -I. (indicando que debe buscar la inclusión en el directorio actual).

Sin el indicador -I , deberá usar #include "myheader.h" para incluir el archivo o mover myheader.h al directorio de include de su myheader.h .

12
12 марта '18 в 2:06 2018-03-12 02:06 La respuesta la da Adrian Zhang el 12 de marzo de 18 a las 2:06 AM 2018-03-12 02:06
  • #include <> es para archivos de encabezado predefinidos.

Si el archivo de encabezado está predefinido, simplemente escriba el nombre del archivo de encabezado entre paréntesis angulares, y se verá así (si tenemos un iostream de nombre de archivo de encabezado predefinido):

 #include <iostream> 
  • #include " " para los archivos de encabezado que el programador define

Si usted (el programador) ha escrito su propio archivo de encabezado, debe escribir el nombre del archivo de encabezado entre comillas. Entonces, supongamos que escribiste un archivo de encabezado llamado myfile.h , entonces este es un ejemplo de cómo deberías usar la directiva de inclusión para incluir este archivo:

 #include "myfile.h" 
11
17 дек. La respuesta se da MobiDev 17 de diciembre. 2012-12-17 10:54 '12 a las 10:54 2012-12-17 10:54

Cuando usa #include <nombre_de_archivo>, el preprocesador busca un archivo en el directorio de archivos de encabezado C \ C ++ (stdio.h \ cstdio, cadena, vector, etc.). Pero cuando se usa #include "nombre de archivo": primero, el preprocesador busca el archivo en el directorio actual, y si no lo hace, lo busca en el directorio de archivos de cabecera C \ C ++.

9
12 апр. La respuesta es dada por Chayim Friedman el 12 de abril. 2018-04-12 09:36 '18 a las 9:36 ; 2018-04-12 09:36

El objeto #include con corchetes angulares buscará una "lista de lugares dependientes de la implementación" (esta es una manera muy complicada de decir "encabezados del sistema") para que se incluya el archivo.

#incluir con comillas solo buscará el archivo (y, "dependiendo de la implementación", bleh). Esto significa que, en inglés normal, intentará utilizar la ruta / nombre del archivo que arrojas en él, y no agregará una ruta del sistema ni interferirá con ella de otra manera.

Además, si #include "" no funciona, se vuelve a leer como #include <> como estándar.

La documentación de gcc tiene una descripción (específica del compilador) que, siendo específica de gcc, en lugar de estándar, es mucho más fácil de entender que en el estilo de la ley ISO.

9
08 февр. respuesta es dada Damon 08 feb. 2011-02-08 15:02 '11 a las 15:02 2011-02-08 15:02
 #include <abc.h> 

Se utiliza para incluir archivos de biblioteca estándar. Por lo tanto, el compilador verificará las ubicaciones de los encabezados de biblioteca estándar.

 #include "xyz.h" 

informará al compilador sobre la inclusión de archivos de encabezado personalizados. Por lo tanto, el compilador comprueba estos archivos de encabezado en la carpeta actual o en carpetas específicas de -I .

8
23 янв. Respuesta dada por Christy Wald el 23 de enero. 2017-01-23 16:36 '17 a las 4:36 pm 2017-01-23 16:36

Muchas de las respuestas aquí se centran en las rutas que el compilador buscará para encontrar el archivo. Mientras que la mayoría de los compiladores hacen esto, el compilador correspondiente puede preprogramar los efectos de los encabezados estándar y tratar, digamos, #include <list> como un conmutador, y no debería existir como un archivo en absoluto.

Esto no es puramente hipotético. Hay al menos un compilador que funciona de esa manera. Se recomienda usar #include <xxx> con encabezados estándar.

8
25 февр. la respuesta se da sp2danny 25 feb. 2014-02-25 13:49 '14 a las 13:49 2014-02-25 13:49
 #include "filename" // User defined header #include <filename> // Standard library header. 

Ejemplo:

Aquí el nombre del archivo es Seller.h :

 #ifndef SELLER_H // Header guard #define SELLER_H // Header guard #include <string> #include <iostream> #include <iomanip> class Seller { private: char name[31]; double sales_total; public: Seller(); Seller(char[], double); char*getName(); #endif 

В реализации класса (например, Seller.cpp и в других файлах, которые будут использовать файл Seller.h ), заголовок, определенный пользователем, теперь должен быть включен следующим образом:

 #include "Seller.h" 
8
ответ дан Barbara 28 сент. '11 в 23:37 2011-09-28 23:37