Директива #include: относительно где? - PullRequest
38 голосов
/ 14 марта 2009

Я заглянул в Язык программирования C ++ , чтобы попытаться найти ответ на этот вопрос. Когда я #include "my_dir/my_header.hpp" в шапке, где он ищет этот файл? Это относительно заголовка, относительно исходного файла, который его включал, или что-то еще?

Ответы [ 6 ]

25 голосов
/ 14 марта 2009

Реализация определена. См. в чем разница между #include и #include «filename» .

9 голосов
/ 14 марта 2009

Относительно как текущего исходного файла, так и любых заданных путей поиска (-I для gcc).

7 голосов
/ 14 марта 2009

Это зависит от того, какой синтаксис вы используете в директиве #include:

#include "path-spec"
#include <path-spec>

Форма в кавычках: эта форма инструктирует препроцессору искать включаемые файлы в том же каталоге файла, который содержит инструкцию #include, а затем в каталогах любых файлов, которые включают (#include) этот файл. Затем препроцессор выполняет поиск по пути, указанному параметром компилятора / I, а затем по путям, указанным в переменной среды INCLUDE.

Форма в угловых скобках: эта форма предписывает препроцессору сначала искать включаемые файлы по пути, указанному параметром компилятора / I, а затем при компиляции из командной строки по пути, указанному переменной среды INCLUDE.

Path-spec - это имя файла, необязательно предшествующее спецификации каталога. Имя файла должно называть существующий файл. Синтаксис спецификации пути зависит от операционной системы, в которой скомпилирована программа.

Эта информация должна быть в документации для вашего конкретного Справочника препроцессора C ++, выше взята из этой статьи на MSDN , в которой есть больше по теме.

2 голосов
/ 14 марта 2009

Полный путь поиска может зависеть от компилятора. Для Visual Studio документация гласит:

(...) инструктирует препроцессор искать включаемые файлы в том же каталоге файла, который содержит инструкцию #include, а затем в каталогах любых файлов, которые включают (#include) этот файл. Затем препроцессор выполняет поиск по пути, указанному параметром компилятора / I, а затем по путям, указанным в переменной среды INCLUDE.

1 голос
/ 14 марта 2009

Его реализация определена. Эти #include «my_dir / xxy.hpp» в файле (например, foo.h) относятся к файлу (foo.h и my_dir находятся на одном уровне в иерархии каталогов) С некоторыми (большинством?) Компиляторами вы можете использовать флаг для использования этих <> (#include

Я знаю, что gcc / g ++ предоставляет флаг -I. Таким образом, вы можете использовать g ++ -I / home [...] указывая, что файл xxy.hpp находится в каталоге / home / my_dir /. Некоторое время назад я не использовал никакой другой компилятор C / C ++.

0 голосов
/ 25 октября 2011

для версии GCC <= 3.0, форма угловых скобок не создает зависимости между включенным файлом и включающим файлом. Поэтому, если вы хотите, чтобы ваш make-файл автоматически генерировал зависимости, вы должны использовать форму в кавычках для файлов, которые должны быть включены в дерево зависимостей. </p>

...