Visual Studio C ++ порядок следования пути для вложенных включаемых файлов - PullRequest
0 голосов
/ 26 апреля 2011

Я нашел статью Где Visual Studio ищет заголовочные файлы C ++? - хорошее начало, но у меня есть дополнительные вопросы. Общий порядок, в котором VS ищет подключаемые файлы: (1) локальный каталог, (2) каталог, указанный в / I, и (3) каталог, указанный в среде (INCLUDE env var или VC ++ settings).

Q1. Я думаю, что параметр / X отключается (3). Правильно? Или он тоже выключается (1)?

Q2. Если у меня есть вложенный включаемый файл (main.c включает inc1.h, который включает inc2.h), где первый включенный файл находится в одной из папок / I, VS ищет второй включенный файл, начинающийся в той же самой папке? Папка / I, или просто локальная папка исходного исходного файла? VS2008, кажется, работает в первую очередь, но я бы хотел где-нибудь документировать его.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2011

Q1. Опция /X отключает INCLUDE var, но не локальный каталог (см. Q2)

Q2. Компиляторы C и C ++ для вложенных включаемых файлов делают местоположение включаемого файла текущим локальным каталогом, поэтому его нельзя отключить.

например. Если ваш inc.h файл найден в одной из папок /I, и он пытается включить такой файл:
#include "foo/foo.h" затем он должен сначала использовать свой собственный локальный каталог, прежде чем все остальные папки /I, так как все они могут иметь папку foo с файлом foo.h, и ваш файл inc.h, вероятно, не будет компилироваться как его просто включил неправильный заголовочный файл.

Я только что нашел эту страницу MSDN для VS2008, которая, кажется, имеет полное объяснение.

0 голосов
/ 26 апреля 2011

Параметр /X не отключает поиск файлов в локальном каталоге (при условии, что вы включаете их как "this.h", а не <this.h>). Вы можете легко проверить это, создав файл

  #include "foo.h"
  int main() {}

создание пустого foo.h и компиляция с использованием флага /X.

Для Q2 мой тест с VC2010 показал, что он ведет себя так же, как и VC2008. То, что я сделал, было главным:

  #include "inc1.h"
  int main() {}

с папкой inc, которая содержала inc1.h, который просто

  #include "inc2.h"

с двумя разными inc2.h файлами; в inc и один в каталоге с моим исходным файлом. Один в моем исходном каталоге был пустым, а в inc была директива #error. В общем, вы не хотите на это полагаться. И в стандартах C, и в C ++ на #include просто говорится, что «указанный исходный файл ищется в соответствии с реализацией».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...