Ответ 1
Оказывается, что typedef
можно разместить после существующего типа (в дополнение к нему). Эта маленькая странность, теперь устаревшая * вызвана тем, как стандарт C "связывает" typedef
с спецификаторами класса хранения, такими как static
и auto
:
Объявление определяется следующим образом:
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}*
Это означает, что спецификаторы объявлений могут отображаться в любом порядке. Теперь спецификатор объявления
<declaration-specifier> ::= <storage-class-specifier>
| <type-specifier>
| <type-qualifier>
И спецификатор класса хранения
<storage-class-specifier> ::= auto
| register
| static
| extern
| typedef
Объявление элементов struct
является спецификатором типа. Как и ключевое слово typedef
, это спецификатор объявления. Поскольку спецификаторы объявлений могут отображаться в любом порядке, оба места размещения typedef
(т.е. До и после struct
) действительны и идентичны друг другу.
*N1570, 6.11.5: "Размещение спецификатора класса хранения, отличного от в начале деклараций декларации является устаревшей особенностью". Спасибо, Keith Thompson, за отличный комментарий!