Это ничего не значит - и фактически это нарушение ограничения.
Грамматика языка позволяет
struct Animal;
вместо объявления члена внутри структуры или объявления объединения. Но это нарушает правило языка ( N1570 6.7.2.1 пункт 2):
Структура-объявление, которое не объявляет анонимную структуру или
Анонимный союз должен содержать список-объявлений-структур.
Это «ограничение», что означает, что его нарушение требует диагностики. (Не смертельное предупреждающее сообщение считается диагностическим.)
Если бы вы написали:
struct Cat {
struct Animal foo;
int category;
};
тогда foo
будет "декларатором". Ограничение, которое я цитировал выше, означает, что вы не можете его опустить. gcc и clang предупреждают об этом по умолчанию («объявление ничего не объявляет») и отклоняют его с помощью -Wpedantic-errors
.
(Анонимные структуры и союзы были добавлены к языку в C11 и обсуждаются здесь , но код в вашем вопросе не является анонимной структурой.)