Const typedef; в C и С++

Какова была первоначальная причина разрешения утверждений, подобных приведенным ниже в C и С++?

const typedef;

Это не кажется практическим.

Также вы можете сделать это: const; и typedef;

Изменить: @AndreyT указывает, что это не стандартное поведение. Для полного ответа я хотел бы узнать о любых возможных преимуществах, которые возникли перед разработчиками GCC, когда они решили, что этот тип кода должен быть компилируемым.

Ответ 1

Это выглядит как вырожденная форма объявления.

В декларации C нет инструкции. Это декларация. И то, что вы имеете выше, не допускается.

6.7 Объявления

2 В декларации объявляется хотя бы декларатор (кроме параметры функции или элементы структуры или объединения), a тег или члены перечисления.

В декларации С++ есть инструкция. Но все же то, что вы имеете выше, не допускается. Из С++ 03

7 Объявления

3 В простой декларации необязательный список init-declarator-list может быть опущено только при объявлении класса (раздел 9) или перечисления (7.2), то есть когда spec-specifier-seq содержит либо class-specifier, разработанный тип-спецификатор с ключом класса (9.1), или спецификатор перечисления.

Если какой-либо компилятор разрешает это в коде C или С++, он должен быть причудой этого компилятора. Вы должны направить этот вопрос своим авторам.

Как вы, наверное, знаете, синтаксис C и С++ не указан только в грамматике. Выполнение этого только по грамматике было бы слишком сложным или совершенно невозможным. Некоторые дополнительные ограничения налагаются текстом, который сопровождает грамматику. Компиляторы обычно относятся к грамматике с уважением, но когда дело доходит до этих сложных дополнительных ограничений... многие компиляторы позволяют некоторым нарушениям проскальзывать.

Я бы сделал обоснованное предположение, что это должно быть побочным эффектом расширения "пустой декларации". С начала раз пустые объявления были незаконными в C и С++. Например, этот код всегда был незаконным

void foo() {}; // In file scope

поскольку он следует определению функции с пустой декларацией. Тем не менее, практически все компиляторы приняли его, разрешив пустые объявления в качестве расширения. По той же причине вы могли написать

;;;; // In file scope

в середине файла и скомпилируйте свой код. То, что у вас есть в вашем примере, также является пустой декларацией, в которую вы добавили некоторые несущественные квалификаторы и спецификаторы класса хранения.

P.S. Исправьте меня, если я ошибаюсь, но С++ 11 легализовал пустые объявления. Я не уверен в C11.