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.
Odpowiedzi:
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_assert
i 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.źródło
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.
źródło
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.
źródło
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?”
źródło
int i; int test(double *p) { i=1; *p=2.0; return i; }
kompilator, nie powinien być wymagany do ponownego załadowaniai
po zapisaniu*p
w przypadku, gdyp
nie ma możliwości przechowywania adresui
. 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 along*
nie wpłynie na along 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.To pytanie nie zostało dokładnie przeszukane w sieci w poszukiwaniu odpowiedzi, w każdym razie możesz spojrzeć na to:
-std=c99
co jest już wspomniane w innych odpowiedziach.źródło
gcc
obsługuje-std=c89
i-std=gnu89
i-std=c99
i-std=gnu99
(i wystarczająco nowoczesne wersje obsługują-std=c11
i-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
).