В C89 / C90 нельзя перемежать объявления и операторы, например помещать объявление (определение) int x[size];
после scanf()
- даже если вы измените измерение на постоянную времени компиляции.
В C89 / C90 нельзя использовать массив переменной длины - поэтому определение int x[size];
недопустимо, поскольку size
не является постоянной времени компиляции.
Компиляторы C99 должны поддерживать как объявления в (почти) произвольных точках функции (им все еще не может предшествовать метка), так и определения массива переменной длины (VLA).
Компиляторы C11 обязаны поддерживать определения переменных (почти) в любом месте функции. Компиляторы C11 могут дополнительно поддерживать VLA ( §6.10.8.3 Макросы условных объектов и §6.7.6.2 Деклараторы массива ) и должны определять __STDC_NO_VLA__
, если они их не поддерживают.
C18 эквивалентен C11 во всех аспектах этого обсуждения.
Только для записи:
- C89 - ANSI X3.159-1989
- C90 - это ISO 9899-1990, версия ANSI которого была помечена как "пересмотр и повторное обозначение ANSI X3.159-1989". Основное отличие заключалось в номерах разделов для языка и библиотеки.
- C99 - это ISO / IEC 9899: 1999
- C11 - ISO / IEC 9899: 2011
- C18 - это ISO / IEC 9899: 2018
Конечно, единственная необычная вещь в X3.159-1989 состояла в том, что она была опубликована ANSI до того, как появился стандарт ISO. Однако ANSI также приняла каждый последующий стандарт ISO, как и другие национальные органы по стандартизации, такие как BSI (Британский институт стандартов) и DIN (Немецкий институт стандартизации или Немецкий институт стандартизации).
Была также Поправка 1 (к ISO 9899: 1990), завершенная в 1994 году и опубликованная в 1995 году. Она добавила заголовки и ввела орграфы и внесла другие изменения. Это почти никогда не рассматривается отдельно, особенно сейчас, 25 лет спустя.
Обратите внимание, что GCC рассматривает опцию -ansi
как эквивалентную -std=c90
, что может привести к путанице в терминологии. Изначально ANSI опубликовала «стандарт ANSI C» примерно за год до того, как выпустила ISO, но намерение всегда заключалось в том, чтобы иметь общий стандарт, и ANSI одобрило стандарт ISO 9899: 1990, когда он был опубликован.