У меня будет следующий фрагмент кода в файле utilA.cpp:
// utilB.h
namespace xm
{
void zoo(struct tm timeval); //<-----line 0
}
// utilA.cpp
#include <utilB.h> //<----line 1
#include <time.h> //<----line 2
namespace xm
{
void foo()
{
struct tm time1 = {0}; //<----line 3
}
}
GCC жалуется при компиляции utilA.cpp,
error: variable 'xm::tm time1' has initializer but incomplete type
Похоже, это потому, что utilA.h
использует struct tm
в строке 0, но не включает time.h
, а компилятор обрабатывает struct tm
в строке 0 в качестве прямого объявления, поэтому struct tm
в строке 2 разрешается как xm::tm
внутри заголовка в строке 0.
Значит, стандарт С++ определяет этот struct tm
как тип параметра функции как форвардное объявление? Пожалуйста, помогите объяснить это, и цитаты из стандарта будут полезны.