требует ли стандарт C, чтобы я определял тип перед typedef
?
Это не так. Стандартный набор слов выглядит следующим образом:
6.7.2.3 Теги
7 Объявление формы
struct-or-union identifier ;
определяет структуру или тип объединения и объявляет идентификатор как тег этого типа.
8 Если спецификатор типа в форме
struct-or-union identifier
встречается другое чем как часть одной из вышеперечисленных форм, и никакое другое объявление идентификатора как тега не видно, то объявляется неполная структура или тип объединения и объявляется идентификатор как тег этого типа.
Итак, ваша исходная пара объявлений имеет четко определенное поведение. Объявление структуры неявно добавляется в единицу перевода в момент, когда вы определяете псевдоним типа, а затем завершается позже. Тот факт, что инструмент не позволяет этого, может быть связан с ошибкой, ограничением инструмента или, возможно, попыткой принудительного применения определенного стиля кодирования.
Есть один аргумент в пользу стиль, который инструмент может попытаться применить, и он имеет отношение к C понятию области действия. В частности, область списка параметров функции. Например, см. Эти вопросы и ответы и обратитесь к этому короткому примеру
void bar(struct foo);
struct foo {
char c;
};
void bar(struct foo f) {}
Так получилось, что первое объявление bar
объявляется с типом, уникальным для его параметра. список. Начальное объявление struct foo
не того же типа, что использовалось в более позднем определении функции. Таким образом, код не будет компилироваться соответствующим компилятором C. Объявление структуры в отдельной строке перед первым объявлением функции решает эту проблему.