Он имеет в виду, что вы не можете вернуть значение struct by-value в заголовке, потому что для этого структура должна быть полностью объявлена. Но это происходит в файле C (объявление, которое делает X
полным типом, «скрыто» в файле C и не отображается в заголовке), в его примере. Следующее объявляет только неполный тип, если это первое объявление структуры
struct X;
Затем вы можете объявить функцию
struct X f(void);
Но вы не можете определить функцию, потому что вы не можете создать переменную этого типа, а тем более вернуть ее (ее размер неизвестен).
struct X f(void) { // <- error here
// ...
}
Ошибка возникает из-за того, что "x" все еще не завершен. Теперь, если вы включите только заголовок с неполным объявлением в нем, то вы не сможете вызвать эту функцию, потому что выражение вызова функции приведет к неполному типу, что запрещено.
Если вы предоставите объявление полного типа struct X
между ними, оно будет действительным
struct X;
struct X f(void);
// ...
struct X { int data; };
struct X f(void) { // valid now: struct X is a complete type
// ...
}
Это относится и к способу использования typedef
: оба они имеют одинаковый (возможно, неполный) тип. Один раз с использованием обычного идентификатора X
, а другой раз с использованием тега struct X
.