Su compilador acaba de intentar compilar el archivo llamado foo.cc
. Al presionar el número de línea line
, el compilador encuentra:
#include "bar"
o
#include <bar>
Luego, el compilador intenta encontrar ese archivo. Para ello, utiliza un conjunto de directorios para buscar, pero dentro de este conjunto, no hay ningún archivo bar
. Para obtener una explicación de la diferencia entre las versiones de la declaración de inclusión, consulte aquí .
Cómo decirle al compilador dónde encontrarlo
g++
tiene una opción -I
. Le permite agregar rutas de búsqueda de inclusión a la línea de comandos. Imagine que su archivo bar
está en una carpeta con el nombre frobnicate
, relativo a foo.cc
(suponga que está compilando desde el directorio donde foo.cc
se encuentra):
g++ -Ifrobnicate foo.cc
Puede agregar más rutas de inclusión; cada uno que da es relativo al directorio actual. El compilador de Microsoft tiene una opción de correlación /I
que funciona de la misma manera, o en Visual Studio, las carpetas se pueden configurar en las Páginas de propiedades del Proyecto, en Propiedades de configuración-> C / C ++ -> General-> Directorios de inclusión adicionales.
Ahora imagine que tiene varias versiones de bar
en diferentes carpetas, dado:
#include<string>
std::string which() { return "A/bar"; }
#include<string>
std::string which() { return "B/bar"; }
#include<string>
std::string which() { return "C/bar"; }
#include "bar"
#include <iostream>
int main () {
std::cout << which() << std::endl;
}
La prioridad con #include "bar"
es la más a la izquierda:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
Como se ve, cuando el compilador empezado a buscar a través A/
, B/
y C/
, se detuvo en el primer o el golpe más a la izquierda.
Esto es cierto para ambas formas include <>
y incude ""
.
Diferencia entre #include <bar>
y#include "bar"
Por lo general, lo #include <xxx>
hace buscar primero en las carpetas del sistema, luego lo #include "xxx"
hace buscar primero en las carpetas actuales o personalizadas.
P.ej:
Imagina que tienes los siguientes archivos en la carpeta de tu proyecto:
list
main.cc
con main.cc
:
#include "list"
....
Para esto, su compilador guardará #include
el archivo list
en la carpeta de su proyecto, porque actualmente se compila main.cc
y ese archivo está list
en la carpeta actual.
Pero con main.cc
:
#include <list>
....
y luego g++ main.cc
, su compilador buscará primero en las carpetas del sistema, y debido a que <list>
es un encabezado estándar, será #include
el archivo nombrado list
que viene con su plataforma C ++ como parte de la biblioteca estándar.
Todo esto está un poco simplificado, pero debería darte una idea básica.
Detalles sobre <>
/ ""
-priorities y-I
Según la documentación de gcc , la prioridad para include <>
es, en un "sistema Unix normal", como sigue:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
Para los programas C ++, también buscará primero en / usr / include / c ++ / version. En lo anterior, target es el nombre canónico del sistema para el que GCC fue configurado para compilar código; [...].
La documentación también dice:
Puede agregar a esta lista con la opción de línea de comando -Idir. Todos los directorios nombrados por -I se buscan, en orden de izquierda a derecha, antes de los directorios predeterminados . La única excepción es cuando dir ya se busca de forma predeterminada. En este caso, la opción se ignora y el orden de búsqueda de los directorios del sistema permanece sin cambios.
Para continuar con nuestro #include<list> / #include"list"
ejemplo (mismo código):
g++ -I. main.cc
y
#include<list>
int main () { std::list<int> l; }
y de hecho, -I.
prioriza la carpeta .
sobre el sistema que incluye y obtenemos un error del compilador.