Jaka jest różnica między C, C99, ANSI C i GNU C?


123

Zacząłem programować na codechef i byłem zdezorientowany różnicą między C i C99. Co oznacza tutaj C? Czy to C89? Sprawdź języki u dołu tego zgłoszenia . Zawiera zarówno C, jak i C99.

Znalazłem w Internecie coś, co nazywa się GNU C. Czy istnieje inne C dla systemów linux / unix? Czy są one zgodne ze standardami C według ANSI? Przeczytałem też w niektórych miejscach „C99 ścisłe”. Co to jest?

Czy są używane inne standardy C? Czy jest coś, co nazywa się C 4.3.2, czy jest to wersja gcc w obecnym użyciu?

EDYTOWAĆ:

To , to , to pomogło. Będę szukać więcej i edytować rzeczy, na które nie ma odpowiedzi.

Nie jestem początkującym programistą. Wiem, co to jest język C. Wiem, że istnieją różne standardy C według ANSI, takie jak C89, C99 i C11.


@Czy nie szukałem dużo. Teraz zrobiłem. Zrobię więcej. i edytuj pytanie więcej.
Aseem Bansal

@Czy nie byłem w stanie znaleźć ścisłego C99 i tego, czy C w codechef to C89, czy wcześniejszy niestandardowy oryginał C.
Aseem Bansal

1
Nie zapomnij o POSIX C :-)
pmg

Odpowiedzi:


216
  • Wszystko przed standaryzacją jest ogólnie nazywane "K&R C", od słynnej książki , której jednym z autorów jest Dennis Ritchie, wynalazca języka C. To był „język C” w latach 1972-1989.

  • Pierwszy standard C został wydany w roku 1989 w Stanach Zjednoczonych przez ich krajowy instytut normalizacyjny ANSI. To wydanie nosi nazwę C89 lub ANSI-C. W latach 1989-1990 był to „język C”.

  • Rok później amerykańska norma została przyjęta na całym świecie i opublikowana przez ISO (ISO 9899: 1990). To wydanie nosi nazwę C90. Technicznie jest to ten sam standard co C89 / ANSI-C. Formalnie zastąpił C89 / ANSI-C, czyniąc je przestarzałymi. W latach 1990-1999 C90 był „językiem C”.

    Proszę zauważyć, że od 1989 roku ANSI nie ma nic wspólnego z językiem C. Programiści, którzy wciąż mówią o „ANSI C”, generalnie nie mają pojęcia, co to znaczy. ISO „jest właścicielem” języka C, zgodnie z normą ISO 9899.

  • Niewielka aktualizacja została wydana w 1995 roku, czasami nazywana „C95”. Nie była to poważna zmiana, ale raczej poprawka techniczna, formalnie nazwana ISO / IEC 9899: 1990 / Amd.1: 1995. Główną zmianą było wprowadzenie szerokiego wsparcia znaków.

  • W 1999 roku norma C przeszła poważną rewizję (ISO 9899: 1999). Ta wersja standardu nosi nazwę C99. W latach 1999-2011 był to „język C”.

  • W 2011 roku norma C została ponownie zmieniona (ISO 9899: 2011). Ta wersja nosi nazwę C11. Do języka dodano różne nowe funkcje _Generic, takie jak _Static_asserti obsługa wątków. W aktualizacji duży nacisk położono na wielordzeniowe, wielordzeniowe przetwarzanie i sekwencjonowanie ekspresji. W latach 2011–2017 był to „język C”.

  • W 2017 r. Poprawiono C11 i rozwiązano różne zgłoszenia usterek. Ten standard nosi nieformalną nazwę C17 i został wydany jako ISO 9899: 2018. Nie zawiera żadnych nowych funkcji, tylko poprawki. Jest to aktualna wersja języka C.


„C99 ścisłe” prawdopodobnie odnosi się do ustawienia kompilatora, który wymusza na kompilatorze literowe przestrzeganie normy. W standardzie C jest termin „ implementacja zgodna” . Zasadniczo oznacza to: „ten kompilator faktycznie implementuje poprawnie język C”. Programy, które poprawnie implementują język C, są formalnie nazywane programami ściśle zgodnymi .

„GNU C” może oznaczać dwie rzeczy. Albo sam kompilator C, który jest częścią kolekcji kompilatorów GNU (GCC). Lub może to oznaczać niestandardową domyślną konfigurację używaną przez kompilator GCC C. Jeśli kompilujesz z gcc program.c, to nie kompilujesz zgodnie ze standardem C, ale raczej niestandardową konfiguracją GNU, którą można nazwać „GNU C”. Na przykład całe jądro Linuksa jest wykonane w niestandardowym GNU C, a nie w standardowym C.

Jeśli chcesz skompilować swoje programy zgodnie ze standardem C, powinieneś wpisać gcc -std=c99 -pedantic-errors. Zastąp c99 c11, jeśli twoja wersja GCC to obsługuje.


8
Ścisłe ustawienie kompilatora może oznaczać „Wyłącz rozszerzenia; używaj tylko języka C zdefiniowanego przez standard ”, a także lub więcej niż„ kompiluj poprawnie ”. Całkowicie poprawne jest akceptowanie rozszerzeń języka; norma została zdefiniowana, aby to umożliwić.
Eric Postpischil

5
Była też poprawka 1 do C94 / C95, która dodała, głównie, szerszą obsługę znaków. Zobacz także listę standardowych plików nagłówkowych w C i C ++ .
Jonathan Leffler

2
Piszesz, że wiele rzeczy zmieniło się od C90 do C99. Czy mógłbyś wymienić kilka?
Martin Thoma,

3
@Lundin, połączyłeś niewłaściwą książkę dla K&R; jest to drugie wydanie opisujące standard C89.
Antti Haapala

5
Tak, ale chodzi o to, że nie jest to wersja, która do tej pory definiowała język programowania C; nie żeby był nigdzie w sprzedaży.
Antti Haapala

7

MUSZĘ odpowiedzieć na temat ANSI C. Chociaż ANSI nic z tym nie zrobiło, kompilatory nadal są do niego zbudowane. Na przykład kompilator PIC XC16: „Kompilator jest w pełni zweryfikowanym kompilatorem zgodnym ze standardem ANSI C zdefiniowanym w specyfikacji ANSI (ANSI x3.159-1989) i opisanym w Kernighan and Ritchie's The C Programming Language (drugie wydanie). ... „Nie wszystkie programy są przeznaczone dla„ dużych ”komputerów, takich jak PC. Pisanie kompilatora dla kosztów twojego urządzenia i weryfikacja kosztów czas i $. ANSI C działa i ma się dobrze i żyje w Twoich urządzeniach embedded / czasu rzeczywistego.


4
  • ANSI C: Pierwszy język C został znormalizowany przez organizację zwaną ANSI w 1989 roku, dlatego nazywa się go c89.

  • C99: zgodnie
    z wymaganiami deweloperów, w latach 1999-2000 dalsze lub dodatkowe słowa kluczowe i funkcje zostały zawarte w C99 (np.: Inline, boolean .. Dodano zmiennoprzecinkowe funkcje biblioteki artematyki)

  • GNU C: GNU jest systemem operacyjnym podobnym do unixa (www.gnu.org) i gdzieś projekt GNU potrzebuje języka programowania C opartego na standardzie ANSI C. GNU używa kompilatora GCC (GNU Compiler Collection) do kompilacji kodu. Posiada funkcję biblioteki C, która definiuje wywołania systemowe, takie jak malloc, calloc, exit ... itd

ANSI C to norma, która jest używana przez inne normy lub nie jest w nich stosowana.


Wszystko o ścisłym C99 i czy C w kodechef to C89, czy wcześniejszy, niestandardowy oryginał C
Aseem Bansal

Poprawka: ANSI C to przestarzały standard, do którego odwołują się tylko nieaktualne dokumenty. Język C nazywa się ISO C lub ISO / IEC 9899: 2011.
Lundin

1

Oprócz odpowiedzi Lundina

Oto, co Dennis Richie ma do powiedzenia na pytanie

„Dlaczego K&R nie czekał na ostateczną, zatwierdzoną normę ANSI przed napisaniem drugiej edycji K&R?”

Dlaczego K&R nie czekał na ostateczny, zatwierdzony standard ANSI przed napisaniem drugiej edycji K&R? Wygląda na to, że ta książka będzie poprawnym standardem tylko przez kilka miesięcy, zanim zostanie zastąpiona ostatecznym standardem ANSI. Wiem, że na tak późnym etapie prawdopodobnie nastąpi kilka poważnych zmian, ale dlaczego nie poczekać kilka miesięcy i upewnić się, że wszystko się zgadza, zamiast prawie natychmiast pisać trzecią edycję lub być przestarzałą?

Pomyśleliśmy, że fajnie byłoby uczcić 10-lecie pierwszej edycji. Mówiąc poważnie, rozpoczęliśmy pracę latem ubiegłego roku, ponieważ mieliśmy wtedy czas i chęć, i okazało się, że X3J11 zbliża się do końca. W grudniu i styczniu, gdy kończyliśmy, zastanawialiśmy się, czy możliwość istotnych zmian uzasadnia odłożenie dostawy i (po omówieniu sprawy z wydawcą) uznaliśmy, że nie warto czekać. PH tego chciał, a Brian i ja chcieliśmy, żeby to zostało wyłączone z naszych planów.

Nawet jeśli nastąpią zmiany w standardzie, trudno sobie wyobrazić, że byłyby na tyle obszerne, aby uzasadnić nową edycję. (Byliśmy nawet przygotowani, aby jakoś poradzić sobie z noaliami, gdyby to trwało.) Jesteśmy gotowi wprowadzić niezbędne zmiany w przyszłym druku, ale jest powód, aby mieć nadzieję, że będą one niewielkie. Członkowie X3J11 bardzo chcą skończyć bez zaskakiwania ludzi; w końcu wielu z nich pracuje dla firm, które przygotowują kompilatory ANSI.

Dennis Ritchie


1
Szkoda, Dennis Ritchie nie zdawał sobie sprawy, w jaki sposób reguły aliasingu zostałyby użyte do zasugerowania, że ​​kompilatory nie powinny podejmować żadnych wysiłków, aby rozpoznać użyteczne formy aliasingu, ale zamiast tego argumentował, że programiści, których kod jest uszkodzony przez tępe kompilatory, powinni „podziękować” kompilatorom za pokazanie im, że ich kod jest „wadliwy” - w przeciwnym razie mógłby powiedzieć ludziom, którzy naciskają na takie zasady, aby wyjaśnić, że odmowa obsługi aliasingu wykraczającego poza minimalne wymagania normy spowoduje, że kompilatory będą nieodpowiednie do niektórych celów, a potrzeba tworzenia aliasów w kodzie niskiego poziomu jest nie wada.
supercat

@supercat Właściwie nie rozumiem, co oznaczają reguły aliasingu, czy możesz mi pomóc?
Suraj Jain

1
Pierwotna koncepcja polegała na tym, że dany kod, taki jak int i; int test(double *p) { i=1; *p=2.0; return i; }kompilator, nie powinien być wymagany do ponownego załadowania ipo zapisaniu *pw przypadku, gdy pnie ma możliwości przechowywania adresu i. Całkowicie rozsądne. Problem polega na tym, że współczesne kompilatory używają tej samej reguły do ​​uzasadnienia założeń, że zapis do a long*nie wpłynie na a long long, nawet jeśli oba typy mają ten sam rozmiar i reprezentację , i że nawet jeśli dwie struktury mają wspólną sekwencję początkową, kod nigdy nie użyje wskaźnik jednego typu do odczytu członka CIS napisanego za pośrednictwem drugiego.
supercat

-2

To pytanie nie zostało dokładnie przeszukane w sieci w poszukiwaniu odpowiedzi, w każdym razie możesz spojrzeć na to:

  1. C to język programowania ogólnego przeznaczenia, początkowo opracowany przez Dennisa Ritchiego w latach 1969-1973 w AT&T Bell Labs.
  2. C99 to standard języka C opublikowany przez ISO i przyjęty przez ANSI około 1999 roku.
  3. GNU C jest tylko rozszerzeniem c89, podczas gdy niektóre funkcje c99 są również dodane, ale w całości różni się od standardu c99, więc podczas kompilacji w gcc musimy wpisać, -std=c99co jest już wspomniane w innych odpowiedziach.
  4. ANSI C to kolejna seria standardów wydawanych przez ANSI.

Szukałem teraz w sieci. Redagowałem pytanie. Wiedziałem o standardach C i ANSI przed wysłaniem pytania. Mam zamieszanie dotyczące określonych rzeczy. Postaram się być bardziej precyzyjny.
Aseem Bansal

Wszystko o ścisłym C99 i czy C w kodechef to C89, czy wcześniejszy, niestandardowy oryginał C
Aseem Bansal

4
Ta odpowiedź zawiera wiele błędów. C99 to standard zdefiniowany przez ISO około 1999 roku. Język C jest międzynarodowo ustandaryzowany od 23 lat. Tak więc ANSI nie ma z tym nic wspólnego, nie dotknęły standardu C. od 24 lat. Obecnie jedynie drukują i rozpowszechniają standard ISO na rynek amerykański.
Lundin

@Lundin Oh !! tak, właściwie napisałem „zdefiniowane”, co nie jest prawdą, powinno zostać tam „przyjęte”. Dokonałem korekty, ANSI wydało pierwszy standard dla C już w 1989 roku, który został przyjęty przez ISO. po tym prawie wszystkie standardy zostały wydane przez ISO i zaadoptowane przez ANSI, a odpowiedź jest krótka, więc wspomniałem tylko o kilku rzeczach, aby odpowiedź była krótka.
0decimal0

1
Zauważ, że gccobsługuje -std=c89i -std=gnu89i -std=c99i -std=gnu99(i wystarczająco nowoczesne wersje obsługują -std=c11i -std=gnu11). Różnica polega na tym, że rozszerzenia w stosunku do Standard C są dostępne automatycznie lub tylko wtedy, gdy źródło nakłania kompilator do udostępnienia mu odpowiednich makr (takich jak -D_XOPEN_SOURCE=700).
Jonathan Leffler
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.