В чем разница между C, C99, ANSI C и GNU C?
Я начал практиковать программирование на codechef и был смущен различием между C и C99. Что здесь означает С? Это С89? Проверьте языки в нижней части этой отправки. Он содержит как C, так и C99.
Я нашел в интернете что-то под названием GNU C. Существует ли другой C для систем linux/unix? Соответствуют ли они стандартам C по ANSI? Я также читал в некоторых местах "C99 строгий". Что это?
Существуют ли какие-либо другие стандарты использования C? Есть что-то под названием C 4.3.2 или это версия gcc в текущем использовании?
РЕДАКТИРОВАТЬ:
Это, Это, Это помогло. Я буду искать больше и редактировать то, что осталось без ответа.
Я не новичок в программировании. Я знаю, что такое язык Си. Я знаю, что существуют разные стандарты C от ANSI, такие как C89, C99 и C11.
5 ответов
Все, что до стандартизации, обычно называют "K&R C", после знаменитой книги, в которой одним из авторов является Деннис Ритчи, изобретатель языка Си. Это был "язык Си" 1972-1989 гг.
Первый стандарт С был выпущен в 1989 году на национальном уровне в США их национальным институтом стандартов ANSI. Этот выпуск называется C89 или ANSI-C. С 1989-1990 гг. Это был "язык Си".
Год спустя американский стандарт был принят на международном уровне и опубликован ISO (ISO 9899:1990). Этот выпуск называется C90. Технически это тот же стандарт, что и C89/ANSI-C. Формально он заменил C89/ANSI-C, что сделало их устаревшими. С 1990-1999 C90 был "языком Си".
Обратите внимание, что с 1989 года ANSI не имеет ничего общего с языком Си. Программисты, все еще говорящие об "ANSI C", обычно не имеют ни малейшего представления о том, что это значит. ISO "владеет" языком C через стандарт ISO 9899.
В 1999 году стандарт С был пересмотрен, многое изменилось (ISO 9899:1999). Эта версия стандарта называется C99. С 1999-2011 года это был "язык Си".
В 2011 году стандарт С был снова изменен (ISO 9899:2011). Эта версия называется C11. Различные новые функции, такие как
_Generic
,_Static_assert
и поддержка потоков были добавлены к языку. В обновлении много внимания уделялось многоядерности, многопроцессорности и секвенированию выражений. С 2011-2017 года это был "язык Си".В 2017 году C11 был пересмотрен, и были решены различные сообщения о дефектах. Этот стандарт неофициально называется C17 и был выпущен как ISO 9899:2018. Он не содержит никаких новых функций, только исправления. Это текущая версия языка Си.
"С99 строгий", скорее всего, относится к настройке компилятора, заставляющей компилятор следовать стандарту буквой. В стандарте C есть термин, соответствующий реализации. По сути это означает: "этот компилятор действительно правильно реализует язык Си". Программы, которые правильно реализуют язык Си, формально называются строго соответствующими программами.
"GNU C" может означать две вещи. Либо сам компилятор C, который входит в коллекцию компиляторов GNU (GCC). Или это может означать нестандартную настройку по умолчанию, которую использует компилятор GCC C. Если вы компилируете с gcc program.c
тогда вы компилируете не по стандарту C, а скорее по нестандартной установке GNU, которая может называться "GNU C". Например, все ядро Linux сделано в нестандартной GNU C, а не в стандартной C.
Если вы хотите скомпилировать свои программы в соответствии со стандартом C, вы должны набрать gcc -std=c99 -pedantic-errors
, Замените c99 на c11, если ваша версия GCC поддерживает это.
Я ДОЛЖЕН ответить по поводу ANSI C. Хотя ANSI ничего не сделал с ним, компиляторы все же созданы для него. Компилятор PIC XC16, например: "Компилятор - это полностью проверенный компилятор, который соответствует стандарту ANSI C, как определено спецификацией ANSI (ANSI x3.159-1989) и описано в Kernighan и Ritchie's C Programming Language (второе издание). ..."Не все программирование предназначено для" больших "компьютеров, таких как ПК. Написание компилятора для вашего устройства стоит, а проверка стоит времени и $. ANSI C жив и здоров во встроенных устройствах / устройствах реального времени.
В дополнение к ответу Лундина
Вот что Деннис Ричи должен сказать, когда его спросят
"Почему K&R не дождалась окончательного утвержденного стандарта ANSI, прежде чем писать K&R 2nd edition?"
Почему K&R не дождалась окончательного утвержденного стандарта ANSI, прежде чем писать K&R 2nd edition? Кажется, что эта книга будет правильным стандартом только в течение нескольких месяцев, прежде чем она будет заменена окончательным стандартом ANSI. Я знаю, что на этой поздней стадии, скорее всего, будет мало серьезных изменений, но почему бы не подождать несколько месяцев и убедиться, что вы все сделали правильно, вместо того, чтобы почти сразу писать 3-е издание или устареть?
Мы подумали, что было бы неплохо отметить 10-летие первого издания. Более серьезно, мы начали работу прошлым летом, потому что у нас было время и желание, и оказалось, что X3J11 подходит к концу. В декабре и январе, когда мы заканчивали, мы рассматривали, оправдывает ли возможность важных изменений откладывание доставки, и (после обсуждения этого вопроса с издателем) решили, что ждать не стоит. PH хотел этого, и Брайан, и я хотели этого от наших планов.
Даже если в стандарте есть изменения, трудно представить, что они будут достаточно обширными, чтобы гарантировать новое издание. (Мы даже были готовы как-то справиться с noalias, если бы это продолжалось.) Мы готовы внести необходимые изменения в будущую печать, но есть основания надеяться, что они должны быть незначительными. Члены X3J11 тоже очень хотят финишировать без удивительных людей; в конце концов, многие из них работают на компании, которые готовят компиляторы ANSI.
Деннис Ритчи
ANSI C: первый язык C был стандартизирован органом под названием ANSI в 1989 году, поэтому он называется c89.
C99:
в соответствии с требованиями разработчиков, в 1999-2000 годах в C99 были включены дополнительные или дополнительные ключевые слова и функции (например: inline, boolean. Добавлены функции библиотеки с плавающей запятой)GNU C: GNU - это операционная система, подобная Unix (www.gnu.org), и где-то проекту GNU требуется язык программирования C, основанный на стандарте ANSI C. GNU использует компилятор GCC (GNU Compiler Collection) для компиляции кода. Он имеет функцию библиотеки C, которая определяет системные вызовы, такие как malloc, calloc, exit... и т. Д.
ANSI C является стандартом, который используется или упоминается другими стандартами.
Этот вопрос не был тщательно найден в сети для ответа, в любом случае вы можете посмотреть на это:
- C - это язык программирования общего назначения, первоначально разработанный Деннисом Ритчи между 1969 и 1973 годами в AT & T Bell Labs.
- C99 - это стандарт языка C, опубликованный ISO и принятый ANSI примерно в 1999 году.
- GNU C - это просто расширение c89, хотя некоторые функции c99 также добавлены, но в целом он отличается от стандарта c99, поэтому при компиляции в gcc мы должны ввести
-std=c99
что уже упоминалось в других ответах. - ANSI C - это последовательная серия стандартов, выпущенных ANSI.