Должен ли я использовать «-ansi» или явное «-std =…» в качестве флагов компилятора?

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

 Cascabel24 апр. 2012 г., 16:46
Я не уверен, что вы действительно можете рассчитывать на сборку с одинаковыми флагами на трех платформах (с разными компиляторами?).
 math24 апр. 2012 г., 17:01
Я действительно не ожидаю этого, но я хочу, чтобы изменения в зависимости от платформы были как можно меньше, поэтому я хотел бы знать, насколько вероятно, что другие компиляторы также используют эти флаги gcc. Теперь меня предупреждают, что это действительно специфично для gcc (я этого не знал).

Ответы на вопрос(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 с99задокументировано здесь.

gcc 4.7 имеетpartial поддержка нового стандарта 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 (если у вас есть GNUinfo команда и документация GCC установлены), или вы можете увидеть несколько версий руководстваВот.

Если вы собираетесь использовать компиляторы, отличные от gcc (и компиляторы, которые стремятся быть gcc-совместимыми), вам придется прочитать их документацию, чтобы узнать, как применять различные версии стандарта C.

 24 апр. 2012 г., 17:25
"даже после всех этих лет" - насколько мне известно, Microsoft официально считает C на Windows тупиком. Он не поддерживает и никогда не будет пытаться поддерживать какую-либо версию, кроме C89, хотя у него есть некоторые особенности.

-ansi а также-std= флаги компилятора могут использоваться другими компиляторами, но ониgcc флаги.

По состоянию на сейчас-ansi эквивалентно-std=c89 вgcc но это может1) изменить в будущем, поэтому я предлагаю вам использовать-std=c89 над-ansi, Действительно, ISO c99, например, также был ратифицирован ANSI.

Следует отметить, что c89 и c90 - это, по сути, один и тот же стандарт C. c89 - это имя ANSI, а c90 - это имя ISO.

Отgcc страница:

There were no technical differences between these publications, although the sections of the ANSI standard were renumbered and became clauses in the ISO standard. This standard, in both its forms, is commonly known as C89, or occasionally as C90, from the dates of ratification.

1) Как отмечено Китом Томпсоном в комментариях, даже если это, вероятно, маловероятно, так как это нарушит многие сценарии сборки.

 24 апр. 2012 г., 16:39
Я бы пошел на-std=c99 если ваш компилятор поддерживает его (то есть что угодно, кроме Microsoft), потому что в C99 есть одна или две приятные вещи, которых нет в C89.
 24 апр. 2012 г., 16:50
Крайне маловероятно, что-ansi будет когда-либо относиться к чему-либо, кроме стандарта C89 / C90. Такое изменение может сломать слишком много сценариев сборки и Make-файлов. Используя название «ANSI C» ссылаться на стандарт 1989 года строго неверно (ANSI приняла или очень скоро примет стандарт ISO 2011 года), но название слишком сильно укоренилось.
 24 апр. 2012 г., 16:50
Что заставляет вас говорить, что значение-ansi может измениться в будущем? Конечно, это возможно (в конце концов, это программное обеспечение), но я предполагаю, что это примерно так же вероятно, как и значение-std=iso9899:1990 меняется.

Ваш ответ на вопрос