Подтвердить что ты не робот

Должен ли я использовать "-ansi" или явный "-std =..." в качестве флагов компилятора?

Я читал, что ANSI C не совсем то же самое, что и ISO C, и компиляторы могут отличаться интерпретацией того, что такое "-ansi" . (gcc отображает его на C90, clang сопоставляет его с C89). В настоящий момент я бы использовал "-std =..." над "-ansi", так как тогда явно показано, какой стандарт используется. Поскольку меня особенно интересует компиляция на Linux, Windows и MAC, я боюсь, что некоторые компиляторы не могли понять "-std =...", но "-ansi". Так есть ли какие-либо плюсы и минусы для использования одного над другим?

4b9b3361

Ответ 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) Как отметил Кейт Томпсон в комментариях, хотя это, вероятно, маловероятно, так как он нарушит многие скрипты сборки. Суб >