Це і відповідь, і розширений коментар до Ні, це не є законним C з 1999 року. Жоден гідний сучасний компілятор C не дозволяє цього.
Так, auto a=1;
це незаконно в С1999 (а також 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 році.