Какой термин * ANSI C * указывает, используется ли он с GNU89, C89, GNU99, C99? - PullRequest
4 голосов
/ 15 марта 2011

В Xcode IDE у меня есть возможность установить диалект языка C на один из

  • ANSI C
  • GNU89
  • C89
  • GNU99
  • C99
  • Компилятор по умолчанию

Я понимаю, что они имеют в виду, кроме ANSI C. Потому что, как я знаю, ANSI C - это просто C89 или C99. Но должна быть причина, по которой это там. Какой термин ANSI C указывает там?

Ответы [ 4 ]

6 голосов
/ 15 марта 2011

edit Кредит переходит к @ Nicholas Knight за публикацию скриншота из окна выбора диалекта C в XCode: http://dl.dropbox.com/u/14571816/xcodelang.png

ANSI C исторически относится к стандарту ANSI C89 (практически то же самое, что и C90). XCode использует версию GCC в качестве серверной части компилятора для компиляции кода C, поэтому я думаю, что именно здесь они получают эти «опции», так как вы можете указать флаг -ansi или различные флаги std=, чтобы выбрать режим Бэкенд компилятора C должен работать для компиляции вашего кода.

Так что, если вы передадите его -ansi и используете компилятор C, это будет эквивалентно -std=c90, что также эквивалентно -std=c89 или -std=iso9899:1990.

-ansi

В режиме C это эквивалентно -std=c90. В режиме C ++ это эквивалентно -std=c++98.

И если вы используете флаги -std, вы можете передавать определенные значения для активации различных языковых функций.

-std=

Определить языковой стандарт. Эта опция в настоящее время поддерживается только при компиляции C или C ++.


Эти аргументы эквивалентны:

c90

c89

iso9899:1990 Поддержка всех программ ISO C90 (некоторые расширения GNU, конфликтующие с ISO C90, отключены). То же, что -ansi для кода C.


Эти аргументы эквивалентны:

iso9899:199409 ISO C90 с изменениями в поправке 1.


Эти следующие аргументы эквивалентны:

c99

c9x

iso9899:1999

iso9899:199x

ISO C99. Обратите внимание, что этот стандарт еще не полностью поддерживается; увидеть http://gcc.gnu.org/gcc-4.5/c99status.html для получения дополнительной информации. Имена c9x и iso9899: 199x устарели.


Эти следующие аргументы эквивалентны:

gnu90

gnu89

GNU диалект ISO C90 (включая некоторые функции C99). Это по умолчанию для C Код.


Эти следующие аргументы эквивалентны:

gnu99

gnu9x

GNU диалект ISO C99. Когда ISO C99 полностью внедрен в GCC, это будет стать по умолчанию. Имя gnu9x устарело.

1 голос
/ 15 марта 2011

Компиляторы имеют профили языков, на которые они нацелены, как сказал pmg в своем ответе ANSI C был одним из самых ранних профилей, который описан в книге K & R.

Интерес представляет вопрос: почему компиляторы поддерживают список профилей устаревших языков? Потому что написание кода для профиля ANSI C является довольно серьезной гарантией того, что ваш код будет работать практически с любым компилятором (что более важно, версия компилятора).

Когда программные проекты заявляют о совместимости с ANSI-C, они говорят вам, что он будет компилироваться везде, где бы вы ни были. Исходный код Lua является примером этого.

1 голос
/ 15 марта 2011

С "родился" в 70-х годах.

В 1978 году Брайан Керниган и Деннис Ритчи опубликовали книгу . Язык, описанный в книге (1-е издание), теперь называется «K & R C».

В 1988 году или около того было опубликовано второе издание. Это второе издание очень и очень похоже на стандарт ANSI (ISO) и является тем изданием, о котором обычно говорят люди, ссылаясь на книгу :)

Авторы компиляторов начали вносить изменения в язык, и для его стандартизации ANSI опубликовала Стандарт в 1989 году (Стандарт C89 или ANSI C). Вскоре за этим последовал стандарт ISO (C90), который практически не вносит изменений в ANSI.

В 1999 году ИСО опубликовала еще один стандарт С: то, что мы называем С99.

Итак, если я прав, ANSI C действовал только в течение нескольких месяцев, но разница между ANSI C и ISO C90 минимальна. Фактически, многие компиляторы сегодня являются компиляторами для ANSI C с дополнительными функциями (а не для ISO C99 с дополнительными функциями, но без некоторых вещей)

0 голосов
/ 15 марта 2011

Предполагая, что вы на самом деле используете GCC в качестве компилятора, ANSI и C89 являются псевдонимами для одной и той же вещи.См .:

http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options

Почему Apple приняла дизайнерское решение представить их обоих, я не уверен.В GCC нет практического различия.Возможно, они параноики в случае, если значение -ansi изменится в более поздних версиях GCC (возможно, до C99).

...