Я начал практиковаться в программировании на 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.
Ответы:
Все, что до стандартизации, обычно называется «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 это поддерживает.источник
Я ДОЛЖЕН ответить по поводу ANSI C. Хотя ANSI ничего не сделал с ним, компиляторы все еще построены для него. Компилятор PIC XC16, например: «Компилятор - это полностью проверенный компилятор, который соответствует стандарту ANSI C, как определено спецификацией ANSI (ANSI x3.159-1989) и описано в языке программирования C Кернигана и Ричи (второе издание). ... «Не все программирование предназначено для« больших »компьютеров, таких как ПК. Написание компилятора для вашего устройства стоит затрат, а проверка затрат времени и долларов. ANSI C жив и здоров и живет в ваших встроенных устройствах / устройствах реального времени.
источник
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 - это стандарт, который используется другими стандартами или ссылается на них.
источник
В дополнение к ответу Лундин
Вот что Деннис Ричи должен сказать, когда его спросили
«Почему K&R не дождалась окончательного утвержденного стандарта ANSI, прежде чем писать 2-е издание K&R?»
источник
int i; int test(double *p) { i=1; *p=2.0; return i; }
как компилятор, не должен перезагружатьсяi
после записи*p
в случай, если онp
может содержать адресi
. Совершенно разумно. Проблема в том, что современные компиляторы используют одно и то же правило для обоснования предположений, что запись в along*
не повлияет на along long
, даже если оба типа имеют одинаковый размер и представление , и что даже если две структуры имеют общую начальную последовательность, код никогда не будет использовать указатель одного типа для чтения члена CIS, записанного через другой.Этот вопрос не был тщательно изучен в сети для ответа, в любом случае вы можете посмотреть на это:
-std=c99
что уже упоминалось в других ответах.источник
gcc
поддерживает-std=c89
and-std=gnu89
and-std=c99
and-std=gnu99
(и достаточно современные версии поддерживают-std=c11
and-std=gnu11
). Разница заключается в том, что расширения стандартного C доступны автоматически или только тогда, когда источник подталкивает компилятор предоставить им соответствующие макросы (например,-D_XOPEN_SOURCE=700
).