При включении файлов с использованием двойных кавычек "
тогда препроцессор будет искать сначала в том же каталоге, что и файл, выполняющий включение.
В вашем случае, если файл proj_dir/a/a.c
имеют:
#include "b.h"
, тогда он будет включать файл proj_dir/a/b.h
.
Если в том же каталоге не найдено ни одного файла, то препроцессор просмотрит пути включения.
При включении с использованием угловых скобок <>
тогда препроцессор сначала будет искать пути включения.
Также обратите внимание, что препроцессор будет искать в каждом пути включения в указанном порядке и перестанет смотреть при первом нажатии . Поэтому, если у вас есть включаемый файл, который находится в нескольких путях включения, будет включен только первый найденный. Таким образом, порядок, в котором вы добавляете пути для поиска, имеет значение.
Хотя это поведение на самом деле определяется реализацией (как упомянуто в комментарии), общее поведение основных реализаций не сильно отличается от этого.
Единственное отклонение - действительно, как добавляются пути system include. MSV C (например) имеет несколько опций для добавления включаемых путей, и они ищутся в указанном порядке c. В то время как G CC имеет предварительно настроенный список системных каталогов, поиск в которых выполняется в первую очередь.
Но что касается поведения включения в двойные кавычки, все реализации сначала используют каталог текущего файла.