/* Does C1x even allow this? Do I have to define struct node inside of inode?
* Are anonymous struct members even allowed to have tags?
*/
struct inode {
struct node;
int data;
};
Во-первых, член struct node
не является анонимным .Это без имени , но поскольку он имеет тег (node
), он не удовлетворяет определению C1x «анонимный».
Кроме этого, это явно разрешено C1xграмматика.Поскольку SO на самом деле не поддерживает подписки, я пометил необязательные элементы квадратными скобками;Я также исключил правила грамматики, которые не нужны, чтобы видеть, что это действительно:
type-specifier:
struct-or-union-specifier
struct-or-union-specifier:
struct-or-union [identifier] { struct-declaration-list }
struct-or-union:
struct
union
struct-declaration-list:
struct-declaration
struct-declaration-list struct-declaration
struct-declaration:
specifier-qualifier-list [struct-declarator-list];
specifier-qualifier-list:
type-specifier [specifier-qualifier-list]
Есть также 4 ограничения, которые должны быть выполнены, но ни одно из них не относится к неназванным элементам, так что этосинтаксически верный C.
Теперь перейдем к вашему реальному вопросу.C1x говорит:
Указатель на объект структуры, соответствующим образом преобразованный, указывает на его начальный член (...) и наоборот.
Полный останов.Нет "если этот участник не назван".Таким образом, указатель на node1
также является указателем на неназванный начальный член, также является указателем на node1.next
.Однако, здесь это становится немного шерстистым.Возможно, я просто пропустил предложение, но кажется, что C1x только говорит, что:
Члены анонимной структуры или объединения считаются членами содержащей структуры или объединения.
Я не могу найти язык, говорящий о том, что члены неназванной структуры считаются членами содержащей структуры.На самом деле может быть так, что не существует гарантированного способа доступа к next
, кроме указания указателя.Я напишу некоторым членам комитета, чтобы попросить разъяснений по этому вопросу.
У вас также могут возникнуть проблемы с инициализацией:
Безымянные члены объектов структуры имеют неопределенное значение дажепосле инициализации.