Что такое спецификатор-квалификатор-список? - PullRequest
5 голосов
/ 24 мая 2010

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’

1 Ответ

5 голосов
/ 24 мая 2010

Это список спецификаторов и квалификаторов :-) Спецификаторы - это такие вещи, как void, char, struct Foo и т. Д., А квалификаторы - это ключевые слова, такие как const и volatile. См. эту грамматику C для определения.

В вашем случае, undefined_type еще не был определен, поэтому анализатор рассматривал его как идентификатор, а не как список спецификаторов-квалификаторов, как ожидалось. Если бы вы были typedef ... undefined_type; до его появления, тогда undefined_type стал бы спецификатором.

Если вы думаете с точки зрения синтаксического анализа C с помощью контекстно-свободной грамматики, то, как компилятор обрабатывает typedefs и тому подобное, может быть утомительным. Если я правильно понимаю, он запускает генератор синтаксических анализаторов, подкрадываясь к операциям с таблицами символов, поэтому он может использовать контекст для анализа исходного кода.

...