Должен ли я использовать "-ansi" или явное "-std=..." в качестве флагов компилятора?
Я читал, что ANSI C не совсем то же самое, что и ISO C, и компиляторы могут отличаться в интерпретации значения "-ansi". (gcc отображает его на C90, clang отображает его на C89) В данный момент я хотел бы использовать "-std=..." вместо "-ansi", поскольку тогда явно показано, какой стандарт используется. Поскольку я особенно заинтересован в компиляции под Linux, Windows и MAC, я боюсь, что некоторые компиляторы могут не понимать "-std=...", но "-ansi". Так есть ли плюсы и минусы для использования одного над другим?
2 ответа
Если вы хотите, чтобы компилятор обеспечил соблюдение стандарта ANSI C 1989 года или, что то же самое, стандарта ISO C 1990 года (они описывают один и тот же язык), вы можете смело использовать любой из них. -ansi
или же -std=c89
,
Имя -ansi
строго говоря, неверно; это относится к стандарту ANSI C 1989 года, но сама ANSI считает этот стандарт устаревшим; он был заменен стандартом ISO C 1999 года (который был официально принят ANSI вскоре после его выпуска), который сам либо был, либо вскоре будет заменен новым стандартом ISO C 2011 года. Но меняя смысл -ansi
вариант сломал бы слишком много Makefile
и строить сценарии.
GCC 4.7 и более поздние версии также распознают -std=c90
как синоним -std=c89
, GCC 4.7 был выпущен в марте 2012 года, поэтому -std=c90
является достаточно переносимым, если вам не нужно разрешать более старые версии gcc.
-std=c99
обеспечивает соблюдение (большей части) стандарта ISO C 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.
-ansi
а также -std=
флаги компилятора могут использоваться другими компиляторами, но они gcc
флаги.
По состоянию на сейчас -ansi
эквивалентно -std=c89
в gcc
но это может1) измениться в будущем, поэтому я предлагаю вам использовать -std=c89
над -ansi
, Действительно, ISO c99, например, также был ратифицирован ANSI.
Вы должны отметить, что c89 и c90 - это по сути один и тот же стандарт C. c89 - это имя ANSI, а c90 - это имя ISO.
От gcc
страница:
Между этими публикациями не было технических различий, хотя разделы стандарта ANSI были перенумерованы и стали пунктами в стандарте ISO. Этот стандарт, в обеих его формах, обычно известен как C89, или иногда как C90, с даты ратификации.
1) Как отметил Кит Томпсон в комментариях, даже если это, вероятно, маловероятно, так как это нарушит многие сценарии сборки.