En los lenguajes de programación C y C ++, ¿cuál es la diferencia entre usar corchetes angulares y usar comillas en una include
declaración, de la siguiente manera?
#include <filename>
#include "filename"
c++
c
include
header-files
c-preprocessor
quest49
fuente
fuente
Respuestas:
En la práctica, la diferencia está en la ubicación donde el preprocesador busca el archivo incluido.
Para
#include <filename>
las búsquedas de preprocesador de una 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"
las búsquedas preprocesador primeros en el mismo directorio que el archivo que contiene la directiva, y luego sigue el camino de búsqueda utilizada para el#include <filename>
formulario. 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 .
fuente
#include <...>
usé el paquete instalado en el sistema y#include "..."
usé la versión del repositorio cercano. Podría tener eso al revés. De cualquier manera, el protector de inclusión en el encabezado empaquetado tiene el prefijo de subrayado. (Podría ser una convención para paquetes o tal vez una forma de evitar deliberadamente mezclar los dos, aunque los calificadores de versión tendrían más sentido para mí.)La única forma 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:
fuente
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
#include "file"
se utiliza el formulario, la implementación primero busca un archivo con el nombre dado, si es compatible. Si no (compatible), o si la búsqueda falla, la implementación se comporta como si#include <file>
se utilizara el otro formulario ( ).Además, existe un tercer formulario y se utiliza cuando la
#include
directiva no coincide con ninguno de los formularios anteriores. De esta forma, se realiza un preprocesamiento básico (como la expansión macro) en los "operandos" de la#include
directiva, y se espera que el resultado coincida con una de las otras dos formas.fuente
<
y>
como la clave para indexar en la biblioteca.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 ,
Por lo tanto, en un entorno compatible con POSIX, con un compilador de C compatible con POSIX,
#include "file.h"
es probable que busque./file.h
primero, dónde.
está el directorio donde está el archivo con la#include
declaración, mientras que#include <file.h>
es probable que busque/usr/include/file.h
primero, dónde/usr/include
está definido su sistema lugares habituales para encabezados (parece que POSIX no lo define).fuente
c99
, que es el nombre POSIX para el compilador de C. (El estándar POSIX 2008 difícilmente podría referirse a C11; la actualización de 2013 a POSIX 2008 no cambió el estándar C al que se refería.)-L
.La documentación de GCC dice lo siguiente sobre la diferencia entre los dos:
fuente
Lo hace:
con
.
ser el directorio del archivo donde#include
está contenido, y / o el directorio de trabajo actual del compilador, y / o eldefault_include_paths
y
Si
./
está adentro<default_include_paths>
, entonces no hay diferencia.Si
mypath/myfile
está en otro directorio de inclusión, el comportamiento es indefinido.fuente
#include "mypath/myfile"
no es equivalente a#include "./mypath/myfile"
. Como dice la respuesta de piCookie, las comillas dobles le dicen al compilador que busque de una manera definida por la implementación, lo que incluye buscar en los lugares especificados#include <...>
. (En realidad, probablemente sea equivalente, pero solo porque, por ejemplo,/usr/include/mypath/myfile
se puede denominar/usr/include/./mypath/myfile
, al menos en sistemas tipo Unix)defaultincludepaths
, en lugar de darle otro significado a.
(como se mencionó anteriormente). Esto tiene la consecuencia esperada de que ambos#include "..."
y#include <...>
buscar en dirpathLa
<file>
inclusión le dice al preprocesador que busque en-I
directorios y en directorios predefinidos primero , luego en el directorio del archivo .c. La"file"
inclusión le dice al preprocesador que primero busque en el directorio del archivo fuente y luego regrese-I
y esté predefinido. Todos los destinos se buscan de todos modos, solo el orden de búsqueda es diferente.El estándar de 2011 trata principalmente los archivos de inclusión en "16.2 Inclusión de archivos fuente".
Tenga en cuenta que el
"xxx"
formulario se degrada<xxx>
si no se encuentra el archivo. El resto está definido por la implementación.fuente
-I
se especifica este negocio?-I
.#include <file.h>
le dice al compilador que busque el encabezado en su directorio "incluye", por ejemplo, para MinGW el compilador buscaríafile.h
en C: \ MinGW \ include \ o donde esté instalado su compilador.#include "file"
le dice al compilador que busque el directorio actual (es decir, el directorio en el que reside el archivo fuente)file
.Puede usar el
-I
indicador de GCC para indicarle que, cuando encuentra una inclusión con corchetes angulados, también debe buscar encabezados en el directorio posterior-I
. GCC tratará el directorio después de la bandera como si fuera elincludes
directorio.Por ejemplo, si tiene un archivo llamado
myheader.h
en su propio directorio, podría decir#include <myheader.h>
si llamó a GCC con el indicador-I .
(lo que indica que debe buscar incluye en el directorio actual).Sin la
-I
bandera, tendrá que usar#include "myheader.h"
para incluir el archivo o moversemyheader.h
alinclude
directorio de su compilador.fuente
Por norma, sí, son diferentes:
Tenga en cuenta que el estándar no indica ninguna relación entre los modos definidos por la implementación. La primera forma busca de una manera definida por la implementación, y la otra de una manera (posiblemente otra) definida por la implementación. La norma también especifica que ciertos archivos de inclusión deben estar presentes (por ejemplo
<stdio.h>
).Formalmente, tendría que leer el manual de su compilador, sin embargo, normalmente (por tradición) el
#include "..."
formulario busca#include
primero en el directorio del archivo en el que se encontró y luego en los directorios en los que#include <...>
busca el formulario (la ruta de inclusión, por ejemplo, encabezados del sistema )fuente
Gracias por las excelentes respuestas, especialmente. Adam Stelmaszczyk y piCookie, y aib.
Al igual que muchos programadores, he usado la convención informal de usar el
"myApp.hpp"
formulario para archivos específicos de la aplicación, y el<libHeader.hpp>
formulario para los archivos del sistema de compilación y biblioteca, es decir, archivos especificados en/I
y laINCLUDE
variable de entorno, durante años pensando que era el estándar.Sin embargo, el estándar C establece que el orden de búsqueda es específico de la implementación, lo que puede complicar la portabilidad. Para empeorar las cosas, usamos jam, que automáticamente determina dónde están los archivos de inclusión. Puede usar rutas relativas o absolutas para sus archivos de inclusión. es decir
Las versiones anteriores de MSVS requerían barras invertidas dobles (\\), pero ahora eso no es necesario. No sé cuando cambió. Simplemente use barras diagonales para compatibilidad con 'nix (Windows lo aceptará).
Si realmente le preocupa, use
"./myHeader.h"
un archivo de inclusión en el mismo directorio que el código fuente (mi proyecto actual, muy grande, tiene algunos nombres de archivos de inclusión duplicados dispersos, realmente un problema de administración de configuración).Aquí está la explicación de MSDN copiada aquí para su conveniencia).
fuente
Al menos para la versión de GCC <= 3.0, la forma de paréntesis angular no genera una dependencia entre el archivo incluido y el incluido.
Entonces, si desea generar reglas de dependencia (usando la opción GCC -M por ejemplo), debe usar el formulario citado para los archivos que deben incluirse en el árbol de dependencia.
(Ver http://gcc.gnu.org/onlinedocs/cpp/Invocation.html )
fuente
Para
#include ""
un compilador normalmente busca la carpeta del archivo que contiene esa inclusión y luego las otras carpetas. Para#include <>
el compilador no busca la carpeta del archivo actual.fuente
<filename>
y"filename"
busca lugares definidos por la implementación.Cuando utiliza #include <nombre de archivo>, el preprocesador busca el archivo en el directorio de archivos de encabezado C \ C ++ (stdio.h \ cstdio, cadena, vector, etc.). Pero, cuando usa #include "filename": primero, el preprocesador busca el archivo en el directorio actual, y si no lo hace aquí, lo busca en el directorio de archivos de encabezado C \ C ++.
fuente
#include
directiva no está estrictamente relacionada con los archivos.Un #include con paréntesis angulares buscará una "lista de lugares dependiente de la implementación" (que es una forma muy complicada de decir "encabezados del sistema") para que se incluya el archivo.
Un #include con comillas solo buscará un archivo (y, "de manera dependiente de la implementación", bleh). Lo que significa que, en inglés normal, intentará aplicar la ruta / nombre de archivo que le arrojas y no antepondrá una ruta del sistema ni la manipulará de otra manera.
Además, si #include "" falla, el estándar lo vuelve a leer como #include <>.
La documentación de gcc tiene una descripción (específica del compilador) que, aunque es específica de gcc y no del estándar, es mucho más fácil de entender que la charla estilo abogado de los estándares ISO.
fuente
zlib.h
en mis rutas de búsqueda de 'usuario', y existe una versión diferente en la ruta de búsqueda del sistema, ¿entonces#include <zlib.h>
incluye la versión del sistema e#include "zlib.h"
incluye la mía?Ejemplo:
El nombre del archivo aquí es
Seller.h
:En la implementación de la clase (por ejemplo,
Seller.cpp
y en otros archivos que usarán el archivoSeller.h
), el encabezado definido por el usuario ahora debe incluirse de la siguiente manera:fuente
#include <>
es para archivos de encabezado predefinidosSi el archivo de encabezado está predefinido, simplemente escribiría el nombre del archivo de encabezado entre paréntesis angulares, y se vería así (suponiendo que tengamos un nombre de archivo de encabezado predefinido iostream):
#include " "
es para archivos de encabezado que el programador defineSi usted (el programador) escribió su propio archivo de encabezado, entonces escribiría el nombre del archivo de encabezado entre comillas. Entonces, supongamos que escribió un archivo de encabezado llamado
myfile.h
, entonces este es un ejemplo de cómo usaría la directiva include para incluir ese archivo:fuente
Muchas de las respuestas aquí se centran en las rutas que buscará el compilador para encontrar el archivo. Si bien esto es lo que hacen la mayoría de los compiladores, se permite que un compilador conforme se programe previamente con los efectos de los encabezados estándar y que se trate, por ejemplo,
#include <list>
como un interruptor, y no es necesario que exista como un archivo.Esto no es puramente hipotético. Hay al menos un compilador que funciona de esa manera.
#include <xxx>
Se recomienda usar solo con encabezados estándar.fuente
se usa para incluir archivos de biblioteca estándar. Por lo tanto, el compilador verificará las ubicaciones donde residen los encabezados de la biblioteca estándar.
le indicará al compilador que incluya archivos de encabezado definidos por el usuario. Por lo tanto, el compilador buscará estos archivos de encabezado en la carpeta actual o en las
-I
carpetas definidas.fuente
En C ++, incluya un archivo de dos maneras:
El primero es #include, que le dice al preprocesador que busque el archivo en la ubicación predeterminada predefinida. Esta ubicación es a menudo una variable de entorno INCLUDE que denota la ruta para incluir archivos.
Y el segundo tipo es #include "nombre de archivo", que le dice al preprocesador que busque primero el archivo en el directorio actual, luego búsquelo en las ubicaciones predefinidas que el usuario haya configurado.
fuente
Forma 1 - # incluye <xxx>
Primero, busca la presencia del archivo de encabezado en el directorio actual desde donde se invoca la directiva. Si no se encuentra, busca en la lista preconfigurada de directorios estándar del sistema.
Formulario 2 - # incluye "xxx"
Esto busca la presencia del archivo de encabezado en el directorio actual desde donde se invoca la directiva.
La lista de directorios de búsqueda exacta depende del sistema de destino, cómo está configurado GCC y dónde está instalado. Puede encontrar la lista del directorio de búsqueda de su compilador GCC ejecutándola con la opción -v.
Puede agregar directorios adicionales a la ruta de búsqueda mediante el uso de - I dir , que hace que se busque dir después del directorio actual (para el formulario de cotización de la directiva) y delante de los directorios estándar del sistema.
Básicamente, la forma "xxx" no es más que buscar en el directorio actual; si no se encuentra retrocediendo el formulario
fuente
#include "header.h"
formulario no es precisa, @personal_cloud. Considero que la respuesta de piCookie y Yann Droneaud es la más relevante, ya que identifican de dónde proviene su información. Tampoco creo que la respuesta mejor votada sea completamente satisfactoria.Se
#include <filename>
utiliza cuando se hace referencia a un archivo del sistema. Ese es un archivo de encabezado que se puede encontrar en ubicaciones predeterminadas del sistema como/usr/include
o/usr/local/include
. Para sus propios archivos que deben incluirse en otro programa, debe usar la#include "filename"
sintaxis.fuente
Idealmente, usaría <...> para las bibliotecas C estándar y "..." para las bibliotecas que escribe y están presentes en el directorio actual.
fuente
La regla general simple es usar corchetes angulados para incluir archivos de encabezado que vienen con el compilador. Use comillas dobles para incluir cualquier otro archivo de encabezado. La mayoría de los compiladores lo hacen de esta manera.
1.9 - Los archivos de encabezado explican con más detalle las directivas de preprocesador. Si eres un programador novato, esa página debería ayudarte a entender todo eso. Lo aprendí de aquí y lo he seguido en el trabajo.
fuente
#include <filename>
se utiliza cuando desea utilizar el archivo de encabezado del sistema C / C ++ o las bibliotecas del compilador. Estas bibliotecas pueden ser stdio.h, string.h, math.h, etc.
#include "path-to-file/filename"
se usa cuando desea usar su propio archivo de encabezado personalizado que está en su carpeta de proyecto o en otro lugar.
Para más información sobre preprocesadores y encabezado. Leer C - Preprocesadores .
fuente
#include <filename>
#include "filename"
#include <filename>
y busca ese archivo de encabezado en donde se almacenaron los archivos de encabezado del sistema.#include <filename>
.fuente
Para ver el orden de búsqueda en su sistema usando gcc, basado en la configuración actual, puede ejecutar el siguiente comando. Puedes encontrar más detalles sobre este comando aquí
cpp -v /dev/null -o /dev/null
fuente
Incluye un archivo donde está el directorio de inclusión predeterminado.
Incluye un archivo en el directorio actual en el que se compiló.
fuente
Existen dos formas de escribir la declaración #include. Estas son:
El significado de cada forma es
Este comando buscaría el archivo
mylib.h
en el directorio actual, así como la lista especificada de directorios como se menciona en la ruta de búsqueda de inclusión que podría haberse configurado.Este comando buscaría el archivo
mylib.h
en la lista especificada de directorios solamente.La ruta de búsqueda de inclusión no es más que una lista de directorios en los que se buscaría el archivo que se incluye. Los diferentes compiladores de C le permiten configurar la ruta de búsqueda de diferentes maneras.
fuente