Я не могу придумать ни одного сценария, где предварительное объявление пропускает необходимую перекомпиляцию при изменении заголовков.
Я думаю, что это тоже немного неясно, и, возможно, можно сформулировать немного более четко.
Что может означать, что зависимость будет скрытой?
Допустим, ваш файл main.cc
нуждается в header.h
для правильной сборки.
Если main.cc
включает header.h
, то это прямая зависимость.
Если main.cc
включает lib.h
, а затем lib.h
включает header.h
, то это косвенная зависимость.
Если main.cc
каким-то образом зависит от lib.h
, но не генерирует ошибку сборки, если lib.h
не включено, то я могу назвать это скрытой зависимостью.
Я не думаю, что слово скрытый является обычным термином для этого, поэтому я согласен, что формулировка может быть уточнена или расширена.
Как это происходит?
У меня есть main.c
, lib.h
и types.h
.
Вот main.c
:
#include "lib.h"
void test(D* x) { f(x); }
Вот lib.h
:
#include "types.h"
void f(B*);
void f(void*);
Вот types.h
:
struct B {};
struct D : B {};
Теперь main.cc
зависит от types.h
для генерации правильного кода. Однако main.cc
имеет прямую зависимость только от lib.h
, у него есть скрытая зависимость от types.h
. Если я использую предварительные объявления в lib.h
, то это ломает main.cc
. И все же main.cc
все еще компилируется!
И причина того, что main.cc
прерывается, заключается в том, что он не включает types.h
, хотя main.cc
зависит от объявлений в types.h
. Предварительные заявления делают это возможным.