Я читал, что ANSI C не совсем то же самое, что и ISO C, и компиляторы могут отличаться интерпретацией того, что такое "-ansi" . (gcc отображает его на C90, clang сопоставляет его с C89). В настоящий момент я бы использовал "-std =..." над "-ansi", так как тогда явно показано, какой стандарт используется. Поскольку меня особенно интересует компиляция на Linux, Windows и MAC, я боюсь, что некоторые компиляторы не могли понять "-std =...", но "-ansi". Так есть ли какие-либо плюсы и минусы для использования одного над другим?
Должен ли я использовать "-ansi" или явный "-std =..." в качестве флагов компилятора?
Ответ 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.
Ответ 2
-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) Как отметил Кейт Томпсон в комментариях, хотя это, вероятно, маловероятно, так как он нарушит многие скрипты сборки. Суб >