Что это значит, когда определяет struct var без идентификатора в структуре на языке c? - PullRequest
0 голосов
/ 20 ноября 2018

На языке C, что означает struct Animal; в строке # 6?
Это законно в C89 или C99 или C11?

struct Animal {
    char *name;
    int age;
};

struct Cat {
    struct Animal;   // line 6
    int category;
};

Спасибо!

1 Ответ

0 голосов
/ 20 ноября 2018

Это ничего не значит - и фактически это нарушение ограничения.

Грамматика языка позволяет

struct Animal;

вместо объявления члена внутри структуры или объявления объединения. Но это нарушает правило языка ( N1570 6.7.2.1 пункт 2):

Структура-объявление, которое не объявляет анонимную структуру или Анонимный союз должен содержать список-объявлений-структур.

Это «ограничение», что означает, что его нарушение требует диагностики. (Не смертельное предупреждающее сообщение считается диагностическим.)

Если бы вы написали:

struct Cat {
    struct Animal foo;
    int category;
};

тогда foo будет "декларатором". Ограничение, которое я цитировал выше, означает, что вы не можете его опустить. gcc и clang предупреждают об этом по умолчанию («объявление ничего не объявляет») и отклоняют его с помощью -Wpedantic-errors.

(Анонимные структуры и союзы были добавлены к языку в C11 и обсуждаются здесь , но код в вашем вопросе не является анонимной структурой.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...