Ten en cuenta que en la informática cualquier problema casi siempere suele tener diferentes resoluciones, pero te enseñaremos lo más óptimo y mejor.
Solución:
Su compilador acaba de intentar compilar el archivo llamado foo.cc
. Al golpear el número de línea line
el compilador encuentra:
#include "bar"
o
#include
Luego, el compilador intenta encontrar ese archivo. Para esto, 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 incluir rutas de búsqueda a la línea de comando. Imagina que tu archivo bar
está en una carpeta llamada 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 das 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 imagina que tienes varias versiones de bar
en diferentes carpetas, dado:
// A/bar
#include
std::string which() return "A/bar";
// B/bar
#include
std::string which() return "B/bar";
// C/bar
#include
std::string which() return "C/bar";
// foo.cc
#include "bar"
#include
int main ()
std::cout << which() << std::endl;
La prioridad con #include "bar"
está más a la izquierda:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
Como puede ver, cuando el compilador comenzó a revisar A/
, B/
y C/
se detuvo en el primer golpe o en el más a la izquierda.
Este es true de ambas formas, include <>
y incude ""
.
Diferencia entre #include
y #include "bar"
Por lo general, el #include
hace que busque primero en las carpetas del sistema, el #include "xxx"
hace que busque 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 #include
el archivo list
en la carpeta de su proyecto, porque actualmente compila main.cc
y ahí está ese archivo list
en la carpeta actual.
Pero con main.cc
:
#include
....
y luego g++ main.cc
su compilador buscará primero en las carpetas del sistema, y debido a que
es un encabezado estándar, lo hará #include
el archivo llamado list
que viene con su plataforma C++ como parte de la biblioteca estándar.
Todo esto está un poco simplificado, pero debería darle una idea básica.
Detalles sobre <>
/""
-prioridades y -I
De acuerdo con 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 se configuró GCC para compilar código; [...].
La documentación también establece:
Puede agregar a esta lista con la opción de línea de comando -Idir. Se buscan todos los directorios nombrados por -I, 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 nuestro #include
ejemplo (mismo código): / #include"list"
g++ -I. main.cc
y
#include
int main () std::list l;
y de hecho, el -I.
prioriza la carpeta .
sobre el sistema incluye y obtenemos un error de compilación.