Qual è la differenza tra C, C99, ANSI C e GNU C?


122

Ho iniziato a programmare la pratica su codechef e sono stato confuso dalla differenza tra C e C99. Cosa significa C qui? È C89? Controlla le lingue in fondo a questo invio . Contiene sia C che C99.

Ho trovato su Internet qualcosa chiamato GNU C. Esiste un C diverso per i sistemi linux / unix? Sono conformi agli standard C di ANSI? Ho anche letto in alcuni punti "C99 strict". Cos'è questo?

Esistono altri diversi standard di C in uso? C'è qualcosa chiamato C 4.3.2 o è la versione gcc attualmente in uso?

MODIFICARE:

Questo , questo , questo ha aiutato. Cercherò di più e modificherò le cose che rimangono senza risposta.

Non sono un principiante della programmazione. So cos'è il linguaggio C. So che ci sono i diversi standard C di ANSI come C89, C99 e C11.


@ Will non avevo cercato molto. Adesso l'ho fatto. Farò di più. e modifica di più la domanda.
Aseem Bansal

@ Will non sono riuscito a trovare C99 rigoroso e se il C in codechef è C89 o il precedente C originale non standardizzato
Aseem Bansal

1
Non dimenticare POSIX C :-)
pmg

Risposte:


216
  • Tutto ciò che precede la standardizzazione è generalmente chiamato "K&R C", dal nome del famoso libro , con Dennis Ritchie, l'inventore del linguaggio C, come uno degli autori. Questa era "la lingua C" dal 1972 al 1989.

  • Il primo standard C è stato rilasciato nel 1989 a livello nazionale negli Stati Uniti, dal loro istituto di standard nazionale ANSI. Questa versione si chiama C89 o ANSI-C. Dal 1989 al 1990 questo era "il linguaggio C".

  • L'anno successivo, lo standard americano è stato accettato a livello internazionale e pubblicato da ISO (ISO 9899: 1990). Questa versione si chiama C90. Tecnicamente, è lo stesso standard di C89 / ANSI-C. Formalmente, ha sostituito C89 / ANSI-C, rendendoli obsoleti. Dal 1990 al 1999, C90 era "il linguaggio C".

    Si noti che dal 1989 ANSI non ha avuto nulla a che fare con il linguaggio C. I programmatori che parlano ancora di "ANSI C" generalmente non hanno la più pallida idea di cosa significhi. ISO "possiede" il linguaggio C, attraverso lo standard ISO 9899.

  • Un aggiornamento minore è stato rilasciato nel 1995, a volte indicato come "C95". Non si trattava di una revisione importante, ma piuttosto di un emendamento tecnico chiamato formalmente ISO / IEC 9899: 1990 / Amd.1: 1995. Il cambiamento principale è stato l'introduzione di un ampio supporto per i personaggi.

  • Nel 1999, lo standard C ha subito una revisione importante (ISO 9899: 1999). Questa versione dello standard si chiama C99. Dal 1999 al 2011, questo era "il linguaggio C".

  • Nel 2011, lo standard C è stato nuovamente modificato (ISO 9899: 2011). Questa versione si chiama C11. Diverse nuove funzionalità come _Generic, _Static_asserte il supporto del filo sono state aggiunte al linguaggio. L'aggiornamento si è concentrato molto su multi-core, multi-elaborazione e sequenziamento delle espressioni. Dal 2011 al 2017, questa era "la lingua C".

  • Nel 2017, il C11 è stato rivisto e sono state risolte varie segnalazioni di difetti. Questo standard è chiamato informalmente C17 ed è stato rilasciato come ISO 9899: 2018. Non contiene nuove funzionalità, solo correzioni. È la versione corrente del linguaggio C.


"C99 strict" si riferisce probabilmente a un'impostazione del compilatore che costringe un compilatore a seguire lo standard alla lettera. C'è un termine implementazione conforme nello standard C. Essenzialmente significa: "questo compilatore implementa effettivamente il linguaggio C correttamente". I programmi che implementano correttamente il linguaggio C sono formalmente chiamati programmi strettamente conformi .

"GNU C" può significare due cose. O il compilatore C stesso che fa parte della GNU Compiler Collection (GCC). Oppure può significare l'impostazione predefinita non standard utilizzata dal compilatore GCC C. Se compili con gcc program.callora non compili secondo lo standard C, ma piuttosto una configurazione GNU non standard, che può essere chiamata "GNU C". Ad esempio, l'intero kernel Linux è realizzato in GNU C non standard e non nello standard C.

Se vuoi compilare i tuoi programmi secondo lo standard C, devi digitare gcc -std=c99 -pedantic-errors. Sostituisci c99 con c11 se la tua versione di GCC lo supporta.


8
L'impostazione rigorosa del compilatore può significare "Disabilita estensioni; utilizzare solo il linguaggio C definito dallo standard "così come, o più," compilare correttamente ". È del tutto corretto accettare estensioni alla lingua; lo standard è stato definito per consentirlo.
Eric Postpischil

5
C'era anche l'emendamento 1 C94 / C95 che aggiungeva principalmente un supporto più ampio ai caratteri. Vedere anche Elenco dei file di intestazione standard in C e C ++ .
Jonathan Leffler

2
Hai scritto che molte cose sono cambiate da C90 a C99. Potresti nominarne alcuni?
Martin Thoma

3
@ Lundin hai collegato il libro sbagliato per K&R; questa è la seconda edizione che descrive lo standard C89.
Antti Haapala

5
Sì, ma il punto è che quella non è la versione che ha definito il linguaggio di programmazione C fino al punto; non che sarebbe in vendita ovunque.
Antti Haapala

7

DEVO rispondere riguardo ad ANSI C. Sebbene ANSI non abbia fatto nulla con esso, i compilatori sono ancora costruiti per esso. Compilatore PIC XC16, ad esempio: "Il compilatore è un compilatore completamente convalidato conforme allo standard ANSI C come definito dalla specifica ANSI (ANSI x3.159-1989) e descritto in The C Programming Language di Kernighan e Ritchie (seconda edizione). ... "Non tutta la programmazione è per computer" grandi "come i PC. La scrittura di un compilatore per i costi del dispositivo e la convalida dei costi time & $. ANSI C è vivo e vegeto e vive nei tuoi dispositivi embedded / in tempo reale.


4
  • ANSI C: Il primo linguaggio C è stato standardizzato dal corpo chiamato ANSI nel 1989, ecco perché è chiamato c89.

  • C99:
    su richiesta degli sviluppatori, nel 1999-2000 sono state incluse ulteriori o ulteriori parole chiave e funzionalità in C99 (es: inline, boolean .. Aggiunte funzioni di libreria arthematic in virgola mobile)

  • GNU C: GNU è un sistema operativo simile a Unix (www.gnu.org) e da qualche parte il progetto GNU necessita di un linguaggio di programmazione C basato sullo standard ANSI C. GNU usa il compilatore GCC (GNU Compiler Collection) per compilare il codice. Ha la funzione di libreria C che definisce le chiamate di sistema come malloc, calloc, exit ... ecc

ANSI C è uno standard utilizzato o referenziato da altri standard.


Qualcosa su C99 rigoroso e se la C in codechef è C89 o la precedente C originale non standardizzata
Aseem Bansal

Correzione: ANSI C è uno standard obsoleto, a cui si fa riferimento solo nei documenti non aggiornati. Il linguaggio C si chiama ISO C, o se vuoi ISO / IEC 9899: 2011.
Lundin

1

Oltre alla risposta di Lundin

Ecco cosa ha da dire Dennis Richie quando gli viene chiesto

"Perché K&R non ha aspettato lo standard ANSI finale approvato prima di scrivere K&R 2a edizione?"

Perché K&R non ha aspettato lo standard ANSI finale approvato prima di scrivere K&R 2a edizione? Sembra che questo libro sarà lo standard corretto solo per pochi mesi prima di essere sostituito dallo standard ANSI finale. So che probabilmente ci saranno pochi cambiamenti importanti in questa fase avanzata, ma perché non aspettare qualche mese e assicurarti di farlo bene al 100%, piuttosto che dover scrivere quasi immediatamente una terza edizione o essere obsoleto?

Abbiamo pensato che sarebbe stato bello celebrare il decimo anniversario della prima edizione. Più seriamente, abbiamo iniziato a lavorare l'estate scorsa perché avevamo tempo e voglia di fare, e sembrava che X3J11 si stesse avvicinando alla fine. A dicembre e gennaio, mentre stavamo finendo, abbiamo considerato se la possibilità di importanti modifiche giustificasse il rinvio della consegna e (dopo aver discusso la questione con l'editore) abbiamo deciso che non valeva la pena aspettare. PH lo voleva, e sia Brian che io lo volevamo fuori dalle nostre agende.

Anche se ci sono cambiamenti nello standard, è difficile immaginare che sarebbero abbastanza ampi da giustificare una nuova edizione. (Eravamo persino preparati ad affrontare in qualche modo i noalias, se fosse durato.) Siamo pronti ad apportare le modifiche necessarie in una futura stampa, ma c'è motivo di sperare che dovrebbero essere minori. I membri di X3J11 sono molto ansiosi di finire senza sorprendere anche le persone; molti di loro lavorano per aziende che stanno preparando compilatori ANSI, dopotutto.

Dennis Ritchie


1
Peccato che Dennis Ritchie non si rendesse conto di come le regole di aliasing sarebbero state utilizzate per implicare che i compilatori non dovrebbero fare alcuno sforzo per riconoscere forme utili di aliasing, ma invece sostenere che i programmatori il cui codice è rotto da compilatori ottusi dovrebbero "ringraziare" i compilatori per mostrando loro che il loro codice è "difettoso" - altrimenti avrebbe potuto dire alle persone che spingono tali regole per chiarire che il rifiuto di supportare l'aliasing oltre i requisiti minimi dello Standard renderà i compilatori inadatti per alcuni scopi, e la necessità di aliasing di codice di basso livello è non un difetto.
supercat

@supercat In realtà non ho capito cosa significano le regole di alias puoi aiutarmi?
Suraj Jain

1
Il concetto originale era che un dato codice come int i; int test(double *p) { i=1; *p=2.0; return i; }un compilatore non dovrebbe essere richiesto di ricaricare idopo la scrittura *pnella remota possibilità che ppotrebbe contenere l'indirizzo di i. Perfettamente ragionevole. Il problema è che i compilatori moderni usano la stessa regola per giustificare le ipotesi che le scritture su a long*non influenzano a long long, anche se entrambi i tipi hanno la stessa dimensione e rappresentazione , e che anche se due strutture condividono una sequenza iniziale comune, il codice non utilizzerà mai un puntatore di un tipo per leggere un membro CIS scritto tramite l'altro.
supercat

-2

Questa domanda non è stata cercata a fondo in rete per trovare una risposta, comunque puoi guardare questa:

  1. C è un linguaggio di programmazione generico sviluppato inizialmente da Dennis Ritchie tra il 1969 e il 1973 presso gli AT&T Bell Labs.
  2. C99 è uno standard del linguaggio C pubblicato dall'ISO e adottato dall'ANSI intorno al 1999.
  3. GNU C è solo un'estensione di c89, mentre vengono aggiunte anche alcune caratteristiche di c99, ma nel complesso è diverso dallo standard c99 quindi quando si compila in gcc dobbiamo inserire -std=c99che è già menzionato nelle altre risposte.
  4. ANSI C è una serie successiva di standard rilasciati da ANSI.

Ho cercato in rete adesso. Ho modificato la domanda. Conoscevo gli standard C e ANSI prima di inviare la domanda. Ho confusione riguardo a cose specifiche. Cercherò di essere più preciso.
Aseem Bansal

Qualcosa su C99 rigoroso e se la C in codechef è C89 o la precedente C originale non standardizzata
Aseem Bansal

4
Questa risposta contiene molti errori. C99 è uno standard definito dall'ISO intorno al 1999. Il linguaggio C è standardizzato a livello internazionale da 23 anni. Quindi ANSI non ha nulla a che fare con questo, non hanno toccato uno standard C in 24 anni. Al giorno d'oggi si limitano a stampare e distribuire lo standard ISO per il mercato americano.
Lundin

@ Lundin Oh !! sì, in realtà ho scritto "definito", il che non è il caso, dovrebbe essere "adottato" lì. Ho fatto la correzione, ANSI ha rilasciato il primo standard per C nel 1989 che è stato adottato dall'ISO. dopo di che quasi tutti gli standard sono stati rilasciati da ISO e adottati da ANSI, e la risposta è breve come se fosse stata richiesta, quindi ho menzionato solo alcune cose mantenendo la risposta breve.
decimale 0

1
Nota che gccsupporta -std=c89e -std=gnu89e -std=c99e -std=gnu99(e versioni abbastanza moderne supportano -std=c11e -std=gnu11). La differenza sta nel fatto che le estensioni rispetto allo Standard C sono disponibili automaticamente o solo quando il codice sorgente spinge il compilatore a fornire loro le macro appropriate (come -D_XOPEN_SOURCE=700).
Jonathan Leffler
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.