Это список спецификаторов и квалификаторов :-) Спецификаторы - это такие вещи, как void
, char
, struct Foo
и т. Д., А квалификаторы - это ключевые слова, такие как const
и volatile
. См. эту грамматику C для определения.
В вашем случае, undefined_type
еще не был определен, поэтому анализатор рассматривал его как идентификатор, а не как список спецификаторов-квалификаторов, как ожидалось. Если бы вы были typedef ... undefined_type;
до его появления, тогда undefined_type
стал бы спецификатором.
Если вы думаете с точки зрения синтаксического анализа C с помощью контекстно-свободной грамматики, то, как компилятор обрабатывает typedefs и тому подобное, может быть утомительным. Если я правильно понимаю, он запускает генератор синтаксических анализаторов, подкрадываясь к операциям с таблицами символов, поэтому он может использовать контекст для анализа исходного кода.