Quelle est la différence entre C, C99, ANSI C et GNU C?


122

J'ai commencé la pratique de la programmation sur codechef et j'ai été confus par la différence entre C et C99. Que signifie C ici? Est-ce C89? Vérifiez les langues au bas de cette soumission . Il contient à la fois C et C99.

J'ai trouvé sur Internet quelque chose qui s'appelle GNU C. Existe-t-il un C différent pour les systèmes Linux / Unix? Sont-ils conformes aux normes C de l'ANSI? J'ai aussi lu à certains endroits "C99 strict". Qu'est-ce que c'est?

Existe-t-il d'autres normes différentes de C utilisées? Y a-t-il quelque chose qui s'appelle C 4.3.2 ou est-ce la version gcc en cours d'utilisation?

ÉDITER:

Ceci , ceci , cela a aidé. Je vais chercher plus et modifier les choses qui restent sans réponse.

Je ne suis pas un débutant en programmation. Je sais ce qu'est le langage C. Je sais qu'il existe les différentes normes C par ANSI comme C89, C99 et C11.


@Est-ce que je n'avais pas beaucoup cherché. Je l'ai fait maintenant. Je ferai plus. et modifiez davantage la question.
Aseem Bansal

@Est-ce que je n'ai pas pu trouver C99 strict et si le C dans codechef est C89 ou le premier C. original non standardisé
Aseem Bansal

1
N'oubliez pas POSIX C :-)
pmg

Réponses:


216
  • Tout avant la standardisation est généralement appelé "K&R C", d'après le célèbre livre , avec Dennis Ritchie, l'inventeur du langage C, comme l'un des auteurs. C'était "le langage C" de 1972 à 1989.

  • La première norme C a été publiée en 1989 à l'échelle nationale aux États-Unis, par leur institut national de normalisation ANSI. Cette version est appelée C89 ou ANSI-C. De 1989 à 1990, c'était "le langage C".

  • L'année suivante, la norme américaine est acceptée au niveau international et publiée par l'ISO (ISO 9899: 1990). Cette version s'appelle C90. Techniquement, il s'agit du même standard que C89 / ANSI-C. Formellement, il a remplacé C89 / ANSI-C, les rendant obsolètes. De 1990 à 1999, C90 était "le langage C".

    Veuillez noter que depuis 1989, ANSI n'a rien à voir avec le langage C. Les programmeurs qui parlent encore de "ANSI C" n'ont généralement pas la moindre idée de ce que cela signifie. L'ISO "possède" le langage C, via la norme ISO 9899.

  • Une mise à jour mineure a été publiée en 1995, parfois appelée «C95». Il ne s'agissait pas d'une révision majeure, mais plutôt d'un amendement technique officiellement nommé ISO / CEI 9899: 1990 / Amd.1: 1995. Le principal changement a été l'introduction d'un large support de caractères.

  • En 1999, la norme C a fait l'objet d'une révision majeure (ISO 9899: 1999). Cette version de la norme est appelée C99. De 1999 à 2011, c'était "le langage C".

  • En 2011, la norme C a de nouveau été modifiée (ISO 9899: 2011). Cette version s'appelle C11. Diverses nouvelles fonctionnalités comme _Generic, _Static_assertet le support de fil ont été ajoutés à la langue. La mise à jour mettait beaucoup l'accent sur le multi-core, le multi-processing et le séquençage d'expression. De 2011 à 2017, c'était "le langage C".

  • En 2017, C11 a été révisé et divers rapports de défauts ont été résolus. Cette norme est officieusement appelée C17 et a été publiée sous la référence ISO 9899: 2018. Il ne contient aucune nouvelle fonctionnalité, juste des corrections. C'est la version actuelle du langage C.


«C99 strict» fait probablement référence à un paramètre de compilateur obligeant un compilateur à suivre la norme à la lettre. Il existe un terme d' implémentation conforme dans la norme C. Essentiellement, cela signifie: "ce compilateur implémente correctement le langage C". Les programmes qui implémentent correctement le langage C sont officiellement appelés programmes strictement conformes .

«GNU C» peut signifier deux choses. Soit le compilateur C lui-même qui fait partie de la collection de compilateurs GNU (GCC). Ou cela peut signifier la configuration par défaut non standard utilisée par le compilateur GCC C. Si vous compilez avec, gcc program.cvous ne compilez pas selon le standard C, mais plutôt une configuration GNU non standard, qui peut être appelée "GNU C". Par exemple, tout le noyau Linux est réalisé en GNU C non standard, et non en C.

Si vous souhaitez compiler vos programmes selon le standard C, vous devez taper gcc -std=c99 -pedantic-errors. Remplacez c99 par c11 si votre version GCC le prend en charge.


8
Le paramètre strict du compilateur peut signifier «Désactiver les extensions; utilisez uniquement le langage C défini par le standard »ainsi que, ou plus,« compile correctement ». Il est tout à fait correct d'accepter les extensions de la langue; la norme a été définie pour permettre cela.
Eric Postpischil

5
Il y avait aussi l'amendement 1 C94 / C95 qui a ajouté un support de caractères plus large, principalement. Voir aussi Liste des fichiers d'en-tête standard en C et C ++ .
Jonathan Leffler

2
Vous écrivez que beaucoup de choses ont changé de C90 à C99. Pouvez-vous en citer quelques-uns?
Martin Thoma

3
@Lundin vous avez lié le mauvais livre pour K&R; c'est la deuxième édition qui décrit la norme C89.
Antti Haapala

5
Ouais, mais le fait est que ce n'est pas la version qui a défini le langage de programmation C jusqu'au point; non pas qu'il serait en vente n'importe où.
Antti Haapala

7

JE DOIS répondre concernant ANSI C. Bien que ANSI n'ait rien fait avec lui, les compilateurs y sont toujours construits. Compilateur PIC XC16 par exemple: «Le compilateur est un compilateur entièrement validé conforme à la norme ANSI C telle que définie par la spécification ANSI (ANSI x3.159-1989) et décrite dans Kernighan et Ritchie's The C Programming Language (deuxième édition). ... "Toute la programmation n'est pas destinée aux" gros "ordinateurs comme les PC. L'écriture d'un compilateur pour votre appareil coûte, et la validation coûte du temps et $. ANSI C est bien vivant et vivant dans vos appareils embarqués / en temps réel.


4
  • ANSI C: Le premier langage C a été normalisé par l'organisme appelé ANSI en 1989, c'est pourquoi il s'appelle c89.

  • C99:
    à la demande des développeurs, en 1999-2000, des mots-clés et fonctionnalités supplémentaires ou supplémentaires ont été inclus dans C99 (ex: inline, boolean .. Ajout de fonctions de bibliothèque arthématique en virgule flottante)

  • GNU C: GNU est un système d'exploitation de type Unix (www.gnu.org) et quelque part le projet de GNU a besoin d'un langage de programmation C basé sur la norme ANSI C. GNU utilise le compilateur GCC (GNU Compiler Collection) pour compiler le code. Il a une fonction de bibliothèque C qui définit les appels système tels que malloc, calloc, exit ... etc.

ANSI C est une norme qui est utilisée par ou référencée par les autres normes.


Tout ce qui concerne C99 strict et si le C dans codechef est C89 ou le C original non standardisé antérieur
Aseem Bansal

Correction: ANSI C est une norme obsolète, qui n'est mentionnée que par les documents périmés. Le langage C est appelé ISO C, ou si vous voulez ISO / CEI 9899: 2011.
Lundin

1

En plus de la réponse Lundin

Voici ce que Dennis Richie a à dire lorsqu'on lui a demandé

"Pourquoi K&R n'a-t-il pas attendu la norme ANSI finale approuvée avant d'écrire la 2ème édition de K&R?"

Pourquoi K&R n'a-t-il pas attendu la norme ANSI finale approuvée avant d'écrire la 2e édition de K&R? Il semble que ce livre ne sera la norme correcte que pendant quelques mois avant d'être remplacé par la norme ANSI finale. Je sais qu'il y aura probablement peu de changements majeurs à ce stade tardif, mais pourquoi ne pas attendre quelques mois et vous assurer de bien faire les choses à 100%, plutôt que d'avoir à écrire presque immédiatement une 3e édition ou d'être obsolète?

Nous avons pensé que ce serait bien de marquer le 10e anniversaire de la première édition. Plus sérieusement, nous avons commencé à travailler l'été dernier car nous avions alors le temps et l'envie, et il semblait que X3J11 approchait de sa fin. En décembre et janvier, alors que nous terminions, nous avons examiné si la possibilité de changements importants justifiait de retarder la livraison et (après en avoir discuté avec l'éditeur) avons décidé que cela ne valait pas la peine d'attendre. PH le voulait, et Brian et moi le voulions tous les deux hors de nos ordres du jour.

Même s'il y a des changements dans la norme, il est difficile d'imaginer qu'ils seraient suffisamment étendus pour justifier une nouvelle édition. (Nous étions même prêts à faire face d'une manière ou d'une autre aux noalias, si cela avait duré.) Nous sommes prêts à faire les changements nécessaires lors d'une prochaine impression, mais il y a des raisons d'espérer qu'ils devraient être mineurs. Les membres de X3J11 ont hâte de finir sans surprendre les gens aussi; beaucoup d'entre eux travaillent pour des entreprises qui préparent des compilateurs ANSI, après tout.

Dennis Ritchie


1
Dommage que Dennis Ritchie n'ait pas réalisé comment les règles d'aliasing seraient utilisées pour impliquer que les compilateurs ne devraient faire aucun effort pour reconnaître des formes utiles d'aliasing, mais soutiennent plutôt que les programmeurs dont le code est cassé par des compilateurs obtus devraient "remercier" les compilateurs pour leur montrant que leur code est «défectueux» - sinon il aurait pu dire aux personnes qui poussent de telles règles de préciser que le refus de prendre en charge l'alias au-delà des exigences minimales du Standard rendra les compilateurs inadaptés à certaines fins, et le besoin d'alias du code de bas niveau est pas un défaut.
supercat

@supercat Je n'ai pas compris ce que signifient les règles d'aliasing, pouvez-vous m'aider?
Suraj Jain

1
Le concept original était qu'un code donné comme int i; int test(double *p) { i=1; *p=2.0; return i; }un compilateur ne devrait pas être nécessaire pour rechargeri après l'écriture dans *ple cas où il ppourrait contenir l'adresse de i. Parfaitement raisonnable. Le problème est que les compilateurs modernes utilisent la même règle pour justifier les hypothèses selon lesquelles l'écriture dans a long*n'affectera pas a long long, même si les deux types ont la même taille et la même représentation , et que même si deux structures partagent une séquence initiale commune, le code n'utilisera jamais un pointeur d'un type pour lire un membre CIS écrit via l'autre.
supercat

-2

Cette question n'a pas été complètement recherchée sur le net pour y répondre, de toute façon vous pouvez regarder ceci:

  1. C est un langage de programmation polyvalent initialement développé par Dennis Ritchie entre 1969 et 1973 chez AT&T Bell Labs.
  2. C99 est une norme du langage C publiée par l'ISO et adoptée par l'ANSI vers 1999.
  3. GNU C n'est qu'une extension de c89, tandis que certaines fonctionnalités de c99 sont également ajoutées, mais dans son intégralité, il est différent du standard c99, donc lors de la compilation dans gcc, nous devons entrer -std=c99ce qui est déjà mentionné dans les autres réponses.
  4. ANSI C est une série successive de normes publiées par ANSI.

J'ai cherché sur le net maintenant. J'ai édité la question. Je connaissais les normes C et ANSI avant de poster la question. J'ai de la confusion concernant des choses spécifiques. J'essaierai d'être plus précis.
Aseem Bansal

Tout ce qui concerne C99 strict et si le C dans codechef est C89 ou le C original non standardisé antérieur
Aseem Bansal

4
Cette réponse contient de nombreuses erreurs. C99 est une norme définie par l'ISO vers 1999. Le langage C est normalisé au niveau international depuis 23 ans. Ainsi, ANSI n'a rien à voir avec cela, ils n'ont pas touché à un standard C depuis 24 ans. Aujourd'hui, ils se contentent d'imprimer et de distribuer la norme ISO pour le marché américain.
Lundin

@Lundin Oh !! ouais, en fait, j'ai écrit "défini" ce qui n'est pas le cas, il devrait être "adopté" là-bas.J'ai fait la correction, l'ANSI a publié la toute première norme pour C way en 1989 qui a été adoptée par l'ISO.après cela presque toutes les normes ont été publiés par l'ISO et adoptés par l'ANSI, et la réponse est brève comme demandé, donc je viens de mentionner quelques choses en gardant la réponse courte.
0decimal0

1
Notez que gccprend en charge -std=c89et -std=gnu89et -std=c99et -std=gnu99(et les versions assez modernes prennent en charge -std=c11et -std=gnu11). La différence est liée au fait que les extensions sur le Standard C sont disponibles automatiquement ou uniquement lorsque la source incite le compilateur à leur fournir les macros appropriées (telles que -D_XOPEN_SOURCE=700).
Jonathan Leffler
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.