Это и ответ, и расширенный комментарий к Нет, это недопустимо для 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.
Большинство компиляторов обычно отклоняют код (отклонение: отказ в создании объектного файла или исполняемого файла), который содержит недопустимый синтаксис. Это тот случай, когда авторы компилятора решили, что неудачная компиляция — не лучший вариант. Лучше всего сделать диагностику, исправить код и продолжить. Слишком много устаревшего кода, приправленного такими конструкциями, как register a=1;
. Компилятор должен уметь компилировать этот код в режиме C99 или C11 (конечно, с диагностикой).
person
David Hammen
schedule
01.05.2014
int
был удален из стандарта C в 1999 году. - person Jens Gustedt   schedule 01.05.2014The code gets compiled without errors by the MS Visual Studio 2012 compiler
- что происходит, когда вы включаете предупреждения? - person Brandin   schedule 01.05.2014