To jest zarówno odpowiedź, jak i rozszerzony komentarz do Nie, to nie jest legalne od 1999 roku. Żaden przyzwoity nowoczesny kompilator C na to nie pozwala.
Tak, auto a=1;
jest nielegalne w C1999 (a także w C2011). To, że jest to teraz nielegalne, nie oznacza, że nowoczesny kompilator C powinien odrzucać kod zawierający takie konstrukcje. Twierdziłbym dokładnie odwrotnie, że przyzwoity, nowoczesny kompilator C musi na to nadal pozwalać.
Zarówno clang, jak i gcc robią to właśnie podczas kompilowania przykładowego kodu w pytaniu względem wersji standardu z 1999 lub 2011 roku. Obaj kompilatorzy wydają diagnostykę, a następnie kontynuują tak, jakby było to stwierdzenie budzące zastrzeżenia auto int a=1;
.
Moim zdaniem to właśnie powinien robić porządny kompilator. Wydając diagnostykę, clang i gcc są w pełni zgodne ze standardem. Standard nie mówi, że kompilator musi odrzucać nielegalny kod. Norma mówi jedynie, że zgodna implementacja musi generować co najmniej jeden komunikat diagnostyczny, jeśli jednostka tłumacząca zawiera naruszenie jakiejkolwiek reguły składniowej lub ograniczenia (5.1.1.3).
Biorąc pod uwagę kod, który zawiera niedozwolone konstrukcje, każdy przyzwoity kompilator spróbuje zrozumieć niedozwolony kod, aby kompilator mógł znaleźć następny błąd w kodzie. Kompilator, który zatrzymuje się przy pierwszym błędzie, nie jest zbyt dobrym kompilatorem. Istnieje sposób, aby wyciągnąć z tego sens auto a=1
, który polega na zastosowaniu reguły „implicit int”. Ta reguła wymusza na kompilatorze interpretację auto a=1
tak, jakby miała miejsce, auto int a=1
gdy kompilator jest używany w trybie C90 lub K&R.
Większość kompilatorów zazwyczaj odrzuca kod (odrzucenie: odmowa wygenerowania pliku obiektowego lub pliku wykonywalnego), który zawiera niedozwoloną składnię. Jest to przypadek, w którym autorzy kompilatora zdecydowali, że niepowodzenie kompilacji nie jest najlepszą opcją. Najlepiej przeprowadzić diagnostykę, naprawić kod i kontynuować. Jest po prostu zbyt wiele starszego kodu, który jest usiany konstrukcjami takimi jak register a=1;
. Kompilator powinien móc skompilować ten kod w trybie C99 lub C11 (oczywiście z diagnostyką).
int
został usunięty ze standardu C w 1999 roku.