2012-03-01 2 views
1

Например, если у меня есть файл с именем foo.h, можно всегда просто включить его, выполнив:больше #include пути когда-либо на самом деле нужно?

#include "foo.h" 

или мне иногда приходится делать что-то вроде:

#include "bar/foobar/foo.h" 

EDIT - они просто используются, чтобы сократить время компиляции, ограничив поиск файла?

+0

Предполагается, что компилятор будет искать подкаталоги, если он не найдет файл в любом из каталогов include. Что заставляет вас думать, что? – sepp2k

ответ

1

Компилятор не собирается рекурсивно искать исходный каталог. Если вы хотите использовать #include "foo.h", вам нужно будет скомпилировать с -Ibar/foobar, чтобы сообщить компилятору, что он должен выглядеть в bar/foobar для файлов заголовков.

В противном случае вам придется использовать полный (относительный) путь. Я предпочитаю это более -I, потому что он делает источник более независимым от флагов компилятора (который вы оцените при смене систем сборки).

0

Могут быть случаи, когда есть несколько файлов заголовков с тем же именем - в этом случае путь помогает устранить неоднозначность.

+0

Да, это то, что у меня есть сейчас. как писать эти простые пути и что они означают, на самом деле то, чего я никогда не узнавал. Что я могу узнать об этом Google? – SirYakalot

0

Я думаю, что это зависит от ваших настроек проекта, например, у вас есть раздел «Дополнительные каталоги Include» в Visual C++, поэтому среда IDE также будет искать файлы в этих каталогах.

2

В принципе, вы можете передать пути включения в качестве параметров компилятора C++, но он не будет искать рекурсивно. Если пройти по пути /opt/include и сделать «#include "foo.h", это будет _ only_ найти /opt/include/foo.h, не /opt/include/dummy/foo.h.

Другими словами, либо вы передаете все возможные включить путь в командной строке, или передать корень в и» навигации "с помощью #include "dummy/foo.h"

Edit:. @MatthieuM сделал еще один хороший пункт ниже, #include "mylibrary/api.h" делает его гораздо понятнее, которые включают в себя файл, который вы используете, чем просто #include "api.h", особенно если вы используете несколько библиотек

+0

Личные заметки: я предпочитаю перемещаться вручную, что облегчает просмотр, откуда происходит конкретное включение. –

+0

@ MatthieuM. Да, то же самое здесь, '#include" mylibrary/api.h "' beats '#include" api.h "' в любой день для удобочитаемости. –

0

. первый оператор #include "foo.h" будет искать foo.h в текущий рабочий каталог или в каталогах, упомянутых в дополнительных дополнительных каталогах.

Если ваш файл заголовка находится по другому пути, вам нужно явно указать его.

+0

, поэтому обычный #include будет искать тот же каталог, в котором находится текущий файл, и ... назад ..? Я немного смущен этим. – SirYakalot

+0

Мое понимание заключается в том, что компилятор переместится на 2 уровня и попытается найти каталог бар. Затем внутри он будет проверять каталог foo, а затем foo.h –

Смежные вопросы