/* 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
, кроме каламбура указателя. Я напишу некоторым людям в комитете, чтобы попросить разъяснений по этому вопросу.
Вы также можете столкнуться с проблемами при инициализации:
Безымянные члены объектов структуры имеют неопределенное значение даже после инициализации.
person
Stephen Canon
schedule
10.09.2011