Как компиляторы знают, где найти #include <stdio.h>?

JScript является реализацией Microsoft Javascript

15
задан Rob Kennedy 14 December 2009 в 09:56
поделиться

6 ответов

Когда компилятор собран, он знает несколько стандартных мест для поиска файла заголовка. Некоторые из них не зависят от того, где установлен компилятор (например, / usr / include, / usr / local / include и т. Д.), А некоторые из них зависят от того, где установлен компилятор (что для gcc, контролируется --prefix при запуске configure).

Такие местоположения, как / usr / include, хорошо известны, и "знание" этого местоположения встроено в gcc. Такие местоположения, как / usr / local / include, не считаются полностью стандартными и могут быть установлены, когда gcc собран с параметром configure --with-local-prefix.

Тем не менее, вы можете добавить новые каталоги, где искать включать файлы с помощью параметра командной строки компилятора -I. При попытке включить файл

13
ответ дан 1 December 2019 в 02:01
поделиться

ОС не знает, где искать эти файлы - это делает компилятор (точнее, препроцессор). У него есть набор путей поиска, в которых он знает, как искать заголовки, так же, как ваша командная оболочка имеет набор мест, где он будет искать программы, которые будут выполняться, когда вы вводите имя. Документация GCC объясняет , как это делает компилятор и как эти пути поиска могут быть изменены.

12
ответ дан 1 December 2019 в 02:01
поделиться

Расположение файла зависит от системы. В самом деле, файл может быть предварительно скомпилирован , а может даже не существовать - компилятор может иметь его как «встроенный». На своем macbook я вижу, что такой файл есть в / usr / include / c ++ / 4.2.1 / iostream , но вам не стоит на него полагаться, и это определенно плохая идея , чтобы отредактировать его.

4
ответ дан 1 December 2019 в 02:01
поделиться

Если бы вы использовали g ++, вы могли бы сделать что-то вроде этого, чтобы узнать, какие включаемые пути искали:

touch empty.cpp
g++ -v empty.cpp

Я не знаю, есть ли эквивалент для Xcode. Может быть, это сработает, поскольку Xcode основан на GCC?

0
ответ дан 1 December 2019 в 02:01
поделиться

Вам следует избегать # включения файлов с использованием абсолютных путей. Компилятор ищет включаемые файлы в различных каталогах и включает файлы, начиная с каждого каталога. Например;

#include <boost/tokenizer.hpp>

Работает, потому что корневой каталог boost содержит папку с именем 'boost', и эта папка либо находится в вашем пути включения по умолчанию, либо вы сделали что-то подобное.

g++ -I$BOOST_ROOT {blah,  blah}

Стандарт C и C ++ использует разделитель UNIX '/ 'будет работать одинаково для всех систем, независимо от того, что хост-система фактически использует для обозначения каталогов. Как уже упоминалось, иногда #include вообще не включает настоящий файл.

0
ответ дан 1 December 2019 в 02:01
поделиться

In Visual Studio, it's either in the project settings if you use the IDE, or in the %INCLUDE% environment variable if you use the command line.

2
ответ дан 1 December 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: