Seu compilador acabou de tentar compilar o arquivo chamado foo.cc
. Ao atingir o número da linha line
, o compilador encontra:
#include "bar"
ou
#include <bar>
O compilador então tenta encontrar esse arquivo. Para isso, ele usa um conjunto de diretórios para pesquisar, mas dentro desse conjunto, não há nenhum arquivo bar
. Para obter uma explicação da diferença entre as versões da instrução include, clique aqui .
Como dizer ao compilador onde encontrá-lo
g++
tem uma opção -I
. Ele permite que você adicione caminhos de pesquisa de inclusão à linha de comando. Imagine que seu arquivo bar
está em uma pasta chamada frobnicate
, relativo a foo.cc
(suponha que você esteja compilando a partir do diretório onde foo.cc
está localizado):
g++ -Ifrobnicate foo.cc
Você pode adicionar mais caminhos de inclusão; cada um dado é relativo ao diretório atual. O compilador da Microsoft possui uma opção de correlação /I
que funciona da mesma maneira, ou no Visual Studio, as pastas podem ser definidas nas páginas de propriedades do projeto, em Propriedades de configuração-> C / C ++ -> Geral-> Diretórios adicionais de inclusão.
Agora imagine que você tenha várias versões de bar
em pastas diferentes, dadas:
#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;
}
A prioridade com #include "bar"
é a mais à esquerda:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
Como você vê, quando o compilador começou a olhar através A/
, B/
e C/
, ele parou na primeira ou hit mais à esquerda.
Isso é verdade para ambas as formas include <>
e incude ""
.
Diferença entre #include <bar>
e#include "bar"
Normalmente, #include <xxx>
faz com que ele examine primeiro as pastas do sistema e primeiro as pastas #include "xxx"
atuais ou personalizadas.
Por exemplo:
Imagine que você tenha os seguintes arquivos na pasta do seu projeto:
list
main.cc
com main.cc
:
#include "list"
....
Para isso, seu compilador irá colocar #include
o arquivo list
na pasta do seu projeto, pois ele atualmente compila main.cc
e existe esse arquivo list
na pasta atual.
Mas com main.cc
:
#include <list>
....
e g++ main.cc
, em seguida , seu compilador examinará primeiro as pastas do sistema e, por <list>
ser um cabeçalho padrão, encontrará #include
o arquivo nomeado list
que vem com sua plataforma C ++ como parte da biblioteca padrão.
Tudo isso é um pouco simplificado, mas deve lhe dar uma ideia básica.
Detalhes sobre as prioridades <>
/ ""
e-I
De acordo com a documentação do gcc , a prioridade para include <>
é, em um "sistema Unix normal", como segue:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
Para programas C ++, ele também irá procurar em / usr / include / c ++ / version, primeiro. Acima, target é o nome canônico do sistema para o qual o GCC foi configurado para compilar o código; [...].
A documentação também afirma:
Você pode adicionar a esta lista com a opção de linha de comando -Idir. Todos os diretórios nomeados por -I são pesquisados, da esquerda para a direita, antes dos diretórios padrão . A única exceção é quando dir já é pesquisado por padrão. Nesse caso, a opção é ignorada e a ordem de pesquisa dos diretórios do sistema permanece inalterada.
Para continuar nosso #include<list> / #include"list"
exemplo (mesmo código):
g++ -I. main.cc
e
#include<list>
int main () { std::list<int> l; }
e, de fato, o -I.
prioriza a pasta .
sobre o sistema inclui e obtemos um erro do compilador.