Я просмотрел язык программирования С++, чтобы попытаться найти ответ на этот вопрос. Когда я #include "my_dir/my_header.hpp"
в заголовке, где он ищет этот файл? Это относительно заголовка относительно исходного файла, который его включил, или что-то еще?
Директива #include: относительно того, где?
Ответ 1
Реализация определена. См. в чем разница между #include <filename> и #include "filename" .
Ответ 2
Он относится как к текущему исходному файлу, так и к любым заданным маршрутам поиска (-I для gcc).
Ответ 3
Это зависит от того, какой синтаксис вы используете в директиве #include:
#include "path-spec"
#include <path-spec>
Цитированная форма: эта форма указывает препроцессору искать файлы include в том же каталоге файла, который содержит оператор #include, а затем в каталогах любых файлов, которые включают (#include) этот файл. Затем препроцессор выполняет поиск по пути, указанному параметром компилятора /I, а затем по путям, указанным переменной среды INCLUDE.
Форма с угловыми скобками: эта форма инструктирует препроцессор для поиска включенных файлов сначала по пути, указанному параметром компилятора /I, а затем при компиляции из командной строки по пути, указанному переменной среды INCLUDE.
Спецификация пути - это имя файла, которому предшествует спецификация каталога. Имя файла должно содержать имя существующего файла. Синтаксис спецификации пути зависит от операционной системы, на которой скомпилирована программа.
Эта информация должна быть в документации для вашей конкретной справки по препроцессору С++, приведенная выше взята из этой статьи в MSDN, которая содержит больше информации о предмет.
Ответ 4
Полный путь поиска может зависеть от компилятора. В Visual Studio:
(...) инструктирует препроцессор искать файлы include в том же каталоге файла, который содержит оператор #include, а затем в каталогах любых файлов, которые включают (#include) этот файл. Затем препроцессор выполняет поиск по пути, указанному параметром компилятора /I, а затем по путям, указанным переменной среды INCLUDE.
Ответ 5
Определена его реализация. Эти #include "my_dir/xxy.hpp" в файле (например, foo.h) относятся к файлу (foo.h и my_dir будут на одном уровне в иерархии каталогов). С некоторыми (большинством?) Компиляторов вы можете использовать флаг для использования этих < > (#include
Я знаю, что gcc/g++ предоставляет флаг -I. Таким образом, вы можете использовать g++ -I/home [...] что файл xxy.hpp находится в каталоге /home/my _dir/. Я уже не использовал какой-либо другой компилятор C/С++.
Ответ 6
для версии GCC <= 3.0, форма угловой скобки не создает зависимость между включенным файлом и включенным. Поэтому, если вы хотите, чтобы ваш make файл автоматически генерировал зависимости, вы должны использовать цитированную форму для файлов, которые должны быть включены в дерево зависимостей.