Где компилятор Visual Studio ищет #include? - PullRequest
0 голосов
/ 01 марта 2012

Если я просто включу файл, написав

#include "blah.h"

, где именно компилятор ищет этот файл?Я понимаю, что есть ограничения.

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

По сути, я не понимаю, как вы перемещаетесь по структуре.Я видел несколько включений, которые выглядят примерно так:

#include ".././foo/whatever/blah.h"

что означают точки?они возвращаются, но означают ли разные числа разные вещи?

Также это основано на структуре файлов на компьютере или их структуре в обозревателе решений?

Большое спасибо запомогите, я понимаю, что это немного простой вопрос - только одна из тех вещей, которые я никогда не изучал.

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Из документации visual studio на # include


Препроцессор ищет включаемые файлы в следующем порядке:

  1. В том же каталоге, что и файл, содержащий оператор #include.

  2. В каталогах любых ранее открытых файлов включаются файлы в обратном порядке, в котором они были открыты. Поиск начинается с каталога включаемого файла, который был открыт последним, и продолжается по каталогу включаемого файла, который был открыт первым.

  3. По пути, указанному каждым параметром компилятора / I.

  4. Вдоль путей, указанных в переменной среды INCLUDE.


Вы можете изменить пути, передаваемые компилятору, с помощью параметров / I в настройках проекта Visual Studio (для конкретных путей проекта) и в параметрах Visual Studio для глобальных путей.

2 точки в пути перемещают вас вверх по каталогу, одна точка относится к текущему каталогу. Любое другое количество точек не будет действительным. Таким образом, ваш пример пути .././foo/whatever/blah.h по сути означает «перейти на один уровень вверх, посмотреть в папке foo, затем посмотреть в папке что угодно». Единственная точка в этом случае ничего не делает.

Эта навигация основана на файловой структуре, а не на структуре в обозревателе решений

1 голос
/ 01 марта 2012

Когда вы пишете #include "a.h" в a.cpp, препроцессор ищет a.h в том же каталоге, где находится a.cpp. Если этот поиск не поддерживается или поиск не удался, то препроцессор ищет последовательность мест, определенных реализацией, для этого a.h.

«что означают точки?»
Допустим, у вас есть файл с этим полным путем: C:\myDir\myProjects\a\a.cpp:
. = C:\myDir\myProjects\a
.. = C:\myDir\myProjects

Вам также следует взглянуть на В чем разница между #include и #include "filename"?

...