Ответ 1
Если вы хотите, чтобы компилятор применял стандарт ANSI C 1989 года, или, эквивалентно стандарту ISO ISO 1990 (они описывают точно такой же язык), вы можете безопасно использовать либо -ansi
, либо -std=c89
.
Название -ansi
, строго говоря, неверно; это относится к стандарту ANSI C 1989 года, но ANSI считает, что стандарт устарел; он был заменен стандартом ISO ISO 1999 (который официально был принят ANSI вскоре после его выхода), который сам либо был, либо вскоре будет заменен новым стандартом ISO C 2011 года. Но изменение значения параметра -ansi
сломало бы слишком много Makefile
и скриптов сборки.
gcc 4.7 и более поздние версии также распознают -std=c90
как синоним для -std=c89
. gcc 4.7 был выпущен в марте 2012 года, поэтому -std=c90
достаточно портативен, если вам не нужно разрешать более старые версии gcc.
-std=c99
применяет (большинство) стандарт ISO ISO 1999 года. Поскольку Microsoft, в частности, не поддерживает C99 (даже после всех этих лет), использование этой опции означает, что компилятор не будет предупреждать вас об использовании особых функций C99, которые могут не поддерживаться нигде. Поддержка gcc C99 задокументирована здесь.
gcc 4.7 имеет частичную поддержку для нового стандарта ISO C 2011, с -std=c11
. Эта поддержка улучшилась в более поздних версиях, но еще не завершена. Состояние gcc C11 описано здесь и, как говорят, похоже на уровень поддержки C99.
Есть больше вариантов и ряд псевдонимов для тех, о которых я упомянул; например, опция -std=c9x
была добавлена до того, как был установлен стандарт ISO 1999, и он все еще поддерживается; аналогично, -std=c1x
является синонимом -std=c11
.
Я считаю, что clang должен быть как можно более совместимым с gcc, поэтому он должен поддерживать одни и те же параметры с теми же значениями (за исключением, возможно, для некоторых из более новых, в зависимости от того, какие версии gcc и clang вы используя).
В руководстве gcc есть полная информация: один раздел, описывающий поддерживаемые стандарты и другой, определяющий различные опции -ansi
и -std=...
. Ссылки относятся к версии 4.7. Вы также можете запустить info gcc
(если у вас есть команда GNU info
и установлена документация gcc), или вы можете увидеть несколько версий руководства здесь.
Если вы собираетесь использовать компиляторы, отличные от gcc (и компиляторы, которые должны быть gcc-совместимыми), вам нужно будет прочитать их документацию, чтобы узнать, как применять различные версии стандарта C.