Директива Include может соответствовать двум файлам: какой приоритет? - PullRequest
0 голосов
/ 05 августа 2020

Какой файл предпочтительнее, если есть два файла с одинаковым указанным именем: первый находится в каталоге, в котором находится файл, который его включает, а второй находится где-то еще, но его каталог находится во включенном пути?

Например: (где proj_dir находится во включаемом пути)

.
└── proj_dir
    ├── a
    │   ├── a.c -> #include "b.h"
    │   └── b.h
    └── b.h

Изменится ли что-нибудь, когда a также находится в включаемом пути?

1 Ответ

2 голосов
/ 05 августа 2020

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

В вашем случае, если файл proj_dir/a/a.c имеют:

#include "b.h"

, тогда он будет включать файл proj_dir/a/b.h.

Если в том же каталоге не найдено ни одного файла, то препроцессор просмотрит пути включения.

При включении с использованием угловых скобок <> тогда препроцессор сначала будет искать пути включения.

Также обратите внимание, что препроцессор будет искать в каждом пути включения в указанном порядке и перестанет смотреть при первом нажатии . Поэтому, если у вас есть включаемый файл, который находится в нескольких путях включения, будет включен только первый найденный. Таким образом, порядок, в котором вы добавляете пути для поиска, имеет значение.

Хотя это поведение на самом деле определяется реализацией (как упомянуто в комментарии), общее поведение основных реализаций не сильно отличается от этого.

Единственное отклонение - действительно, как добавляются пути system include. MSV C (например) имеет несколько опций для добавления включаемых путей, и они ищутся в указанном порядке c. В то время как G CC имеет предварительно настроенный список системных каталогов, поиск в которых выполняется в первую очередь.

Но что касается поведения включения в двойные кавычки, все реализации сначала используют каталог текущего файла.

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