В чем разница между C, C99, ANSI C и GNU C?


124

Я начал практиковаться в программировании на codechef, и меня смутила разница между C и C99. Что здесь означает C? Это C89? Проверьте языки внизу этого представления . Он содержит как C, так и C99.

Я нашел в Интернете что-то под названием GNU C. Есть ли другой C для систем linux / unix? Соответствуют ли они стандартам C ANSI? Я также читал кое-где "C99 strict". Что это?

Существуют ли какие-либо другие стандарты языка Си? Есть ли что-то под названием C 4.3.2 или это используемая сейчас версия gcc?

РЕДАКТИРОВАТЬ:

Это , это , это помогло. Я буду искать больше и редактировать то, что осталось без ответа.

Я не новичок в программировании. Я знаю, что такое язык C. Я знаю, что существуют различные стандарты C ANSI, такие как C89, C99 и C11.


@ Уилл, я не особо много искал. Я сделал сейчас. Я сделаю больше. и отредактируйте вопрос подробнее.
Aseem Bansal

@Will Я не смог найти о C99 strict и о том, является ли C в codechef C89 или более ранний нестандартный оригинальный C.
Aseem Bansal

1
Не забывайте о POSIX C :-)
pmg

Ответы:


217
  • Все, что до стандартизации, обычно называется «K&R C», в честь знаменитой книги с Деннисом Ричи, изобретателем языка C, в качестве одного из авторов. Это был «язык Си» с 1972 по 1989 год.

  • Первый стандарт C был выпущен в 1989 году в США национальным институтом стандартов ANSI. Этот выпуск называется C89 или ANSI-C. В 1989–1990 это был «язык Си».

  • Через год американский стандарт был принят на международном уровне и опубликован ISO (ISO 9899: 1990). Этот выпуск называется C90. Технически это тот же стандарт, что и C89 / ANSI-C. Формально он заменил C89 / ANSI-C, сделав их устаревшими. В 1990–1999 годах C90 был «языком Си».

    Обратите внимание, что с 1989 года ANSI не имел ничего общего с языком C. Программисты, все еще говорящие об «ANSI C», обычно не понимают, что это означает. ISO «владеет» языком C через стандарт ISO 9899.

  • В 1995 году было выпущено небольшое обновление, иногда называемое «C95». Это не было серьезным пересмотром, а скорее технической поправкой, официально названной ISO / IEC 9899: 1990 / Amd.1: 1995. Основным изменением стало введение широкой поддержки персонажей.

  • В 1999 году стандарт C претерпел серьезные изменения (ISO 9899: 1999). Эта версия стандарта называется C99. С 1999 по 2011 год это был «язык Си».

  • В 2011 году стандарт C был снова изменен (ISO 9899: 2011). Эта версия называется C11. Различные новые функции , такие как _Generic, _Static_assertи поддержка потоков были добавлены к языку. В обновлении большое внимание уделялось многоядерности, многопроцессорности и секвенированию экспрессии. С 2011-2017 года это был «язык Си».

  • В 2017 году C11 был переработан, и были устранены различные отчеты о дефектах. Этот стандарт неофициально называется C17 и был выпущен как ISO 9899: 2018. Он не содержит новых функций, только исправления. Это текущая версия языка C.


"C99 strict", скорее всего, относится к настройке компилятора, заставляющей компилятор следовать стандарту по буквам. В стандарте C есть термин « соответствующая реализация» . По сути это означает: «этот компилятор действительно правильно реализует язык C». Программы, которые правильно реализуют язык C, формально называются строго соответствующими программами .

«GNU C» может означать две вещи. Либо сам компилятор C, который входит в состав GNU Compiler Collection (GCC). Или это может означать нестандартную настройку по умолчанию, которую использует компилятор GCC C. Если вы компилируете с, gcc program.cто вы компилируете не в соответствии со стандартом C, а скорее нестандартную установку GNU, которая может называться «GNU C». Например, все ядро ​​Linux выполнено на нестандартном GNU C, а не на стандартном C.

Если вы хотите скомпилировать свои программы в соответствии со стандартом C, вы должны ввести gcc -std=c99 -pedantic-errors. Замените c99 на c11, если ваша версия GCC это поддерживает.


8
Строгая настройка компилятора может означать «Отключить расширения; используйте только язык C, определенный стандартом », а также, или даже больше,« компилировать правильно ». Допускать расширения к языку совершенно правильно; стандарт был определен, чтобы позволить это.
Eric Postpischil

5
Также была поправка 1 C94 / C95, которая в основном добавляла более широкую поддержку символов. См. Также Список стандартных файлов заголовков в C и C ++ .
Джонатан Леффлер

2
Вы пишете, что многое изменилось с C90 на C99. Не могли бы вы назвать несколько?
Мартин Тома

3
@Lundin, вы связали не ту книгу с K&R; это второе издание, в котором описывается стандарт C89.
Антти Хаапала,

5
Да, но дело в том, что это не та версия, которая определяла язык программирования C до этого момента; не то чтобы он где-нибудь продавался.
Антти Хаапала

7

Я ДОЛЖЕН ответить по поводу ANSI C. Хотя ANSI ничего не сделал с ним, компиляторы все еще построены для него. Компилятор PIC XC16, например: «Компилятор - это полностью проверенный компилятор, который соответствует стандарту ANSI C, как определено спецификацией ANSI (ANSI x3.159-1989) и описано в языке программирования C Кернигана и Ричи (второе издание). ... «Не все программирование предназначено для« больших »компьютеров, таких как ПК. Написание компилятора для вашего устройства стоит затрат, а проверка затрат времени и долларов. ANSI C жив и здоров и живет в ваших встроенных устройствах / устройствах реального времени.


4
  • ANSI C: первый язык C был стандартизирован организацией под названием ANSI в 1989 году, поэтому он получил название c89.

  • C99:
    по требованию разработчиков, в 1999-2000 годах в C99 были включены дополнительные ключевые слова и функции (например, встроенные, логические .. Добавлены функции художественной библиотеки с плавающей запятой)

  • GNU C: GNU - это unix-подобная операционная система (www.gnu.org), и где-то проекту GNU нужен язык программирования C, основанный на стандарте ANSI C. GNU использует компилятор GCC (GNU Compiler Collection) для компиляции кода. Он имеет библиотечную функцию C, которая определяет системные вызовы, такие как malloc, calloc, exit ... и т. Д.

ANSI C - это стандарт, который используется другими стандартами или ссылается на них.


Что-нибудь о строгом C99 и о том, является ли C в codechef C89 или более ранний нестандартизированный оригинальный C
Aseem Bansal

Исправление: ANSI C - устаревший стандарт, на который ссылаются только устаревшие документы. Язык C называется ISO C, или, если хотите, ISO / IEC 9899: 2011.
Lundin

1

В дополнение к ответу Лундин

Вот что Деннис Ричи должен сказать, когда его спросили

«Почему K&R не дождалась окончательного утвержденного стандарта ANSI, прежде чем писать 2-е издание K&R?»

Почему K&R не дождался окончательного утвержденного стандарта ANSI перед тем, как написать 2-е издание K&R? Похоже, что эта книга будет правильным стандартом только в течение нескольких месяцев, прежде чем ее заменит окончательный стандарт ANSI. Я знаю, что на этом позднем этапе, вероятно, будет несколько серьезных изменений, но почему бы не подождать несколько месяцев и убедиться, что вы сделали все правильно, вместо того, чтобы почти немедленно писать 3-е издание или быть устаревшим?

Мы подумали, что неплохо было бы отметить 10-летие первого издания. А если серьезно, то мы начали работу прошлым летом, потому что тогда у нас было время и желание, и казалось, что X3J11 подходит к концу. В декабре и январе, когда мы заканчивали, мы рассматривали, оправдывает ли возможность важных изменений отложить доставку, и (после обсуждения этого вопроса с издателем) решили, что этого не стоит ждать. PH хотел этого, и мы с Брайаном хотели, чтобы это не входило в наши планы.

Даже если в стандарт внесены изменения, трудно представить, что они будут достаточно обширными, чтобы потребовать новую редакцию. (Мы даже были готовы как-то справиться с ноалиями, если они затянулись.) Мы готовы внести необходимые изменения в будущую печать, но есть основания надеяться, что они будут незначительными. Члены X3J11 очень хотят закончить, не удивляя людей; в конце концов, многие из них работают в компаниях, которые готовят компиляторы ANSI.

Деннис Ричи


1
Жаль, что Деннис Ричи не понимал, как будут использоваться правила псевдонима, чтобы подразумевать, что компиляторы не должны прилагать никаких усилий для распознавания полезных форм псевдонимов, а вместо этого доказывают, что программисты, чей код нарушен тупыми компиляторами, должны «благодарить» компиляторы за показывая им, что их код «неисправен» - в противном случае он мог бы сказать людям, продвигающим такие правила, чтобы дать понять, что отказ от поддержки псевдонимов сверх минимальных требований стандарта сделает компиляторы непригодными для некоторых целей, а потребность низкоуровневого кода в псевдониме будет не дефект.
supercat

@supercat На самом деле я не понял, что означают правила псевдонима, вы можете мне помочь?
Сурадж Джайн

1
Первоначальная концепция заключалась в том, что данный код, такой int i; int test(double *p) { i=1; *p=2.0; return i; }как компилятор, не должен перезагружаться iпосле записи *pв случай, если он pможет содержать адрес i. Совершенно разумно. Проблема в том, что современные компиляторы используют одно и то же правило для обоснования предположений, что запись в a long*не повлияет на a long long, даже если оба типа имеют одинаковый размер и представление , и что даже если две структуры имеют общую начальную последовательность, код никогда не будет использовать указатель одного типа для чтения члена CIS, записанного через другой.
supercat

-2

Этот вопрос не был тщательно изучен в сети для ответа, в любом случае вы можете посмотреть на это:

  1. C - это язык программирования общего назначения, первоначально разработанный Деннисом Ричи в период с 1969 по 1973 год в AT&T Bell Labs.
  2. C99 - это стандарт языка C, опубликованный ISO и принятый ANSI примерно в 1999 году.
  3. GNU C - это просто расширение c89, в то время как некоторые функции c99 также добавлены, но в целом он отличается от стандарта c99, поэтому при компиляции в gcc мы должны ввести, -std=c99что уже упоминалось в других ответах.
  4. ANSI C - это последовательный ряд стандартов, выпущенных ANSI.

Я искал сейчас в сети. Редактировал вопрос. Я знал о стандартах C и ANSI, прежде чем задавать вопрос. У меня возникла путаница по поводу конкретных вещей. Постараюсь уточнить.
Aseem Bansal

Что-нибудь о строгом C99 и о том, является ли C в codechef C89 или более ранний нестандартный оригинальный C
Aseem Bansal

4
В этом ответе много ошибок. C99 - это стандарт, определенный ISO около 1999 года. Язык C был стандартизирован на международном уровне в течение 23 лет. Таким образом , ANSI не имеет ничего общего с ним, они не коснулись стандарта C в течение 24 лет. В настоящее время они просто печатают и распространяют стандарт ISO для американского рынка.
Lundin

@Lundin Ой !! да, на самом деле я написал «определено», что не так, это должно быть «принято» там. Я внес исправление, ANSI выпустил самый первый стандарт для C еще в 1989 году, который был принят ISO. после этого почти все стандарты были выпущены ISO и приняты ANSI, и ответ краток, так что я просто упомянул несколько вещей, чтобы дать краткий ответ.
0decimal0

1
Обратите внимание, что gccподдерживает -std=c89and -std=gnu89and -std=c99and -std=gnu99(и достаточно современные версии поддерживают -std=c11and -std=gnu11). Разница заключается в том, что расширения стандартного C доступны автоматически или только тогда, когда источник подталкивает компилятор предоставить им соответствующие макросы (например, -D_XOPEN_SOURCE=700).
Джонатан Леффлер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.