GCC нравится говорить мне, что я пропускаю список спецификатора спецификатора в его сообщениях об ошибках.
Я знаю, что это означает, что я не вставил корректный тип чего-то.
Но что такое точно список спецификатора спецификатора?
Править:
Пример C код, который вызывает это:
#include <stdio.h>
int main(int argc, char **argv) {
struct { undefined_type *foo; } bar;
printf("Hello, world!");
}
Дает эти ошибки от GCC:
Lappy:code chpwn$ gcc test.c
test.c: In function ‘main’:
test.c:4: error: expected specifier-qualifier-list before ‘undefined_type’
Это список спецификаторов и квалификаторов :-) Спецификаторы — это такие вещи, как void
, char
, struct Foo
и т. Д., А квалификаторы — это ключевые слова, такие как const
и volatile
. См. эту грамматику C для определения.
В вашем случае undefined_type
еще не был определен, поэтому синтаксический анализатор рассматривал его как идентификатор, а не как список спецификатор-квалификатор-список, как ожидалось. Если бы вы typedef ... undefined_type;
до его появления, то undefined_type
станет спецификатором.
Если вы думаете с точки зрения синтаксического анализа C с контекстно-свободной грамматикой, то, как компилятор обрабатывает typedefs и тому подобное, может быть надоедливым. Если я правильно понимаю, он обыгрывает генератор парсера, пробираясь в операции таблицы символов, чтобы он мог использовать контекст для синтаксического анализа исходного кода.