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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top