Ответ 1
Это подробно описано в руководстве gcc, доступном (если оно установлено), набрав info gcc
или онлайн здесь. Соответствующий раздел руководства 4.7.2 здесь.
По умолчанию gcc не соответствует ни одному из стандартов ANSI/ISO C. Текущее значение по умолчанию эквивалентно -std=gnu90
, которое является стандартом 1989/1990 с расширениями, специфичными для GNU. (Некоторая диагностика, требуемая по языковому стандарту, не выдается.) Версия 5.1.0, выпущенная 2015-04-22, изменила значение по умолчанию от -std=gnu90
до -std=gnu11
, как описано здесь.
Если вы хотите стандартное соответствие, вы можете использовать любое из следующих действий:
-std=c90 -pedantic
-std=c99 -pedantic
-std=c11 -pedantic
-std=c90
также может быть записано -ansi
, -std=c89
или -std=iso9899:1990
.
-std=iso9899:199409
поддерживает стандарт C90 плюс поправку 1995 года, в которой добавлено несколько второстепенных функций (все из которых также находятся на C99).
-std=c99
также может быть записано -std=c9x
или -std=iso9899:1999
(имя c9x
использовалось до публикации стандарта). Поддержка C99 не совсем завершена, но она закрывается.
-std=c11
также может быть записано -std=c0x
или -std=iso9899:2011
(имя c0x
использовалось до публикации окончательного стандарта, ошибочно предполагалось, что x
не будет превышать 9). Поддержка C11 также является неполной; текущее состояние приведено здесь.
Параметр -pedantic
заставляет gcc печатать требуемую диагностику для нарушений ограничений и правил синтаксиса. В некоторых случаях эта диагностика - это всего лишь предупреждения - и нет простого способа различать эти предупреждения и другие предупреждения, которые не требуются языком. Замените -pedantic
на -pedantic-errors
, чтобы gcc рассматривал нарушения языка как фатальные ошибки.
Быстрая история стандарта:
- C89 был первым официальным стандартом C, опубликованным ANSI в 1989 году.
- C90 была ISO версия стандарта, описывающая точно тот же язык, что и C89. ANSI официально приняла ISO-версию стандарта. Было два технических исправления, исправляющих некоторые ошибки.
- C95 был поправкой к C90, добавив несколько функций, главным образом орграфов и широкую поддержку символов. Насколько я знаю, объединенная версия никогда не публиковалась.
- C99 был выпущен ISO в 1999 году. Было три технических исправления.
- C11 был выпущен ISO в 2011 году. Было одно Техническое исправление, в котором были определены определения
__STDC_VERSION__
и__STDC_LIB_EXT1__
.
ANSI не выпускала собственные версии стандартов 1999 или 2011 годов, вместо этого применяя стандарты ISO.
N1256 - свободно доступный черновик стандарта C99, в который вошли 3 технических исправления.
N1570 - свободно доступный черновик стандарта C11. Между ним и опубликованным стандартом C11 есть несколько незначительных отличий, а также одно техническое исправление. Для получения дополнительной информации см. мой ответ на этот вопрос.