Яка різниця між C, C99, ANSI C і GNU C?


123

Я розпочав практику програмування в кодефікуванні і був збентежений різницею між C і C99. Що тут означає C? Це C89? Перевірте мови внизу цього подання . Він містить як C, так і C99.

Я знайшов в Інтернеті щось, що називається GNU C. Чи існує інший С для систем Linux / Unix? Чи відповідають вони стандартам C ANSI? Я також читав у деяких місцях "С99 суворий". Що це?

Чи використовуються якісь інші стандарти стандарту C? Чи є щось, що називається C 4.3.2 або це версія gcc у поточному використанні?

Редагувати:

Це , Це , Це допомогло. Я буду шукати більше та відредагувати речі, які залишаються без відповіді.

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


@Буду, я не дуже шукав. Я зробив зараз. Я зроблю більше. і більше редагуйте питання.
Асеем Бансал

@Чи не зможу я дізнатися про C99 суворо і про те, чи є C у кодексі C89 або попередній нестандартний оригінал C.
Aseem Bansal

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

Відповіді:


216
  • Все до стандартизації, як правило, називається "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 не мали нічого спільного з мовою 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. Він не містить нових функцій, лише виправлення. Це поточна версія мови С.


"С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 підтримує його.


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) та описаний у програмі мови програмування на Керніган та Річі (друга редакція). ... "Не все програмування призначене для" великих "комп'ютерів, таких як ПК. Написання компілятора для вашого пристрою коштує, а також перевірка витрат часу & $. ANSI C живий і здоровий і живе у ваших вбудованих / в режимі реального часу пристроїв.


4
  • ANSI C: Перша мова С була стандартизована тілом під назвою ANSI в 1989 році, тому її називають c89.

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

  • GNU C: GNU - це операційна система на зразок Unix (www.gnu.org), і десь проект GNU потребує мови програмування C на основі стандарту ANSI C. GNU використовує компілятор GCC (Колекція компілятора GNU) для компіляції коду. Він має функцію C-бібліотеки, яка визначає системні виклики, такі як malloc, calloc, exit ... тощо

ANSI C - це стандарт, який застосовують інші стандарти.


Все, що стосується C99, суворого та того, чи є C у кодефіку C89 чи раніше нестандартизованого оригіналу C
Aseem Bansal

Виправлення: ANSI C - це застарілий стандарт, на який посилаються лише застарілі документи. Мова C називається ISO C, або якщо ви будете ISO / IEC 9899: 2011.
Лундін

1

На додаток до Лундін Відповідь

Ось що Денніс Річі повинен сказати на запитання

"Чому K&R не дочекалися остаточного, затвердженого стандарту ANSI перед тим, як написати друге видання K&R?"

Чому K&R не дочекалися остаточного затвердженого стандарту ANSI перед тим, як написати друге видання K&R? Схоже, що ця книга буде правильним стандартом лише за кілька місяців, перш ніж вона буде замінена остаточним стандартом ANSI. Я знаю, що на цьому пізньому етапі, ймовірно, буде кілька великих змін, але чому б не почекати кілька місяців і переконатися, що ви отримаєте це на 100% правильно, а не потрібно майже одразу написати 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. Ідеально розумний. Проблема полягає в тому, що сучасні компілятори використовують одне і те ж правило для виправдання припущень, які записують в long*не вплине на a long long, навіть якщо обидва типи мають однаковий розмір і представлення , і що навіть якщо дві структури мають спільний початковий послідовність, код ніколи не використовуватиме вказівник одного типу для читання члена СНД, написаного через інший.
supercat

-2

Це запитання не було ретельно шукано в мережі для відповіді, все одно ви можете подивитися на це:

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

Зараз я шукав у мережі. Я редагував питання. Я знав про стандарти C та ANSI, перш ніж ставити питання. У мене плутанина щодо конкретних речей. Я спробую бути більш точним.
Асеем Бансал

Все, що стосується C99, суворого та того, чи є C у кодефіку C89 чи раніше нестандартного оригіналу C
Aseem Bansal,

4
Ця відповідь містить багато помилок. C99 - це стандарт, визначений ISO близько 1999 року. Мова C міжнародно стандартизована протягом 23 років. Таким чином ANSI нічого спільного з цим не має, вони не торкнулися стандарту С протягом 24 років. Сьогодні вони просто друкують та розповсюджують стандарт ISO для американського ринку.
Лундін

@Lundin О !! так, насправді я написав "визначено", що це не так, його слід "прийняти". Я вніс виправлення, ANSI випустив найперший стандарт для С ще в 1989 році, який був прийнятий ISO. Після цього майже всі стандарти були випущені ISO і прийняті ANSI, і відповідь коротка, як запитання, тому я лише зазначив декілька речей, не даючи відповіді короткою.
0decimal0

1
Зауважте, що gccпідтримує -std=c89і -std=gnu89та -std=c99і -std=gnu99(і досить сучасні версії підтримують -std=c11і -std=gnu11). Різниця полягає в тому, що розширення на Standard C доступні автоматично або лише тоді, коли джерело надає компілятору надання їм відповідних макросів (наприклад, -D_XOPEN_SOURCE=700).
Джонатан Леффлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.