Como os compiladores sabem onde encontrar #include ?
-
19-09-2019 - |
Pergunta
Estou me perguntando como os compiladores no Mac OS X, Windows e Linux sabem onde encontrar os arquivos de cabeçalho C.
Especificamente, estou me perguntando como ele sabe onde encontrar o #include com o <>
Suportes.
#include "/Users/Brock/Desktop/Myfile.h" // absolute reference
#include <stdio.h> // system relative reference?
Presumo que exista um arquivo de texto no sistema que ele consulte. Como ele sabe onde procurar os cabeçalhos? É possível modificar esse arquivo, se sim, onde esse arquivo reside no sistema operacional?
Solução
Quando o compilador é construído, ele sabe sobre alguns locais padrão para procurar arquivo de cabeçalho. Alguns deles são independentes de onde o compilador está instalado (como/usr/incluir,/usr/local/incluir etc.) e alguns são baseados em onde o compilador está instalado (que para GCC, é controlado pelo -Opção Prefixar ao executar a configuração).
Locais como /usr /incluem são bem conhecidos e o 'conhecimento' desse local é incorporado ao GCC. Locais como/usr/local/incluir não são considerados completamente padrão e podem ser definidos quando o GCC é construído com a opção de configuração de prefixo-with-local.
Dito isto, você pode adicionar novos diretórios para onde procurar incluir arquivos usando a opção Comando -i do compilador -i. Ao tentar incluir um arquivo, ele procurará nos diretórios especificados com o sinalizador -i antes dos diretórios que eu falei no primeiro parágrafo.
Outras dicas
O sistema operacional não sabe onde procure esses arquivos - o compilador (ou mais precisamente, o pré -processador). Ele possui um conjunto de caminhos de pesquisa em que sabe procurar cabeçalhos, assim como o seu shell de comando tem um conjunto de lugares onde procurará programas para executar quando você digitar um nome. A documentação do GCC explica Como esse compilador faz isso e como esses caminhos de pesquisa podem ser alterados.
A localização do arquivo depende do sistema. Na verdade, o arquivo pode ser pré -compilado, ou pode nem existir-o compilador pode tê-lo como um 'embutido'. No meu MacBook, vejo que existe esse arquivo em /usr/include/c++/4.2.1/iostream
, mas você não deve confiar nisso, e é definitivamente um péssima ideia Para editá -lo.
No Visual Studio, está nas configurações do projeto se você usar o IDE, ou no %INCLUDE%
Variável de ambiente se você usar a linha de comando.
Se você estivesse usando o G ++, poderia fazer algo assim para descobrir o que incluía os caminhos foram pesquisados:
touch empty.cpp
g++ -v empty.cpp
Não sei se há um equivalente para o Xcode. Talvez isso funcione, já que o Xcode é baseado no GCC?
Você deve evitar #Incluir arquivos usando caminhos absolutos. O compilador procura os arquivos inclui em vários diretórios e inclui arquivos, começando em cada diretório. Por exemplo;
#include <boost/tokenizer.hpp>
Funciona porque o diretório raiz do Boost contém uma pasta chamada 'Boost' e essa pasta está no seu padrão inclui caminho ou você fez algo como.
g++ -I$BOOST_ROOT {blah, blah}
É um padrão C e C ++ que o separador Unix '/' funcionará da mesma maneira para todos os sistemas, independentemente do que o sistema host realmente usa para denotar diretórios. Como outros mencionados, ocasionalmente #include não inclui um arquivo real.