Это и ответ, и расширенный комментарий к « Нет», это не разрешено для C с 1999 года. Ни один достойный современный компилятор C не позволяет этого.
Да, auto a=1;
это незаконно в C1999 (а также C2011). То, что это теперь незаконно, не означает, что современный компилятор C должен отклонять код, содержащий такие конструкции. Я бы сказал с точностью до наоборот, что достойный современный компилятор C все же должен позволять это.
И clang, и gcc делают это при компиляции примера кода в вопросе против версий стандарта 1999 или 2011 годов. Оба компилятора выдают диагностику, а затем продолжают работу, как если бы было ошибочное утверждение auto int a=1;
.
На мой взгляд, это то, что должен делать достойный компилятор. Выполняя диагностику, clang и gcc полностью соответствуют стандарту. В стандарте не говорится, что компилятор должен отклонять недопустимый код. Стандарт просто говорит, что соответствующая реализация должна выдавать по крайней мере одно диагностическое сообщение, если единица трансляции содержит нарушение любого синтаксического правила или ограничения (5.1.1.3).
Учитывая код, содержащий недопустимые конструкции, любой достойный компилятор попытается разобраться в недопустимом коде, чтобы компилятор мог найти следующую ошибку в коде. Компилятор, который останавливается при первой ошибке, не очень хороший компилятор. Есть способ разобраться в auto a=1
этом - применить правило "неявного int". Это правило заставляет компилятор интерпретировать, auto a=1
как если бы он был, auto int a=1
когда компилятор используется в режиме C90 или K&R.
Большинство компиляторов обычно отклоняют код (reject: отказ от создания объектного файла или исполняемого файла), который содержит недопустимый синтаксис. Это тот случай, когда авторы компилятора решили, что отказ от компиляции - не лучший вариант. Лучше всего выполнить диагностику, исправить код и продолжить. Слишком много унаследованного кода, приправленного такими конструкциями, как register a=1;
. Компилятор должен уметь компилировать этот код в режиме C99 или C11 (конечно, с диагностикой).
int
был удален из стандарта C в 1999 году.