Ответ 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.