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.
Réponses:
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_assert
et 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.c
vous 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.la source
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.
la source
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.
la source
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?"
la source
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*p
le cas où ilp
pourrait contenir l'adresse dei
. 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 along*
n'affectera pas along 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.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:
-std=c99
ce qui est déjà mentionné dans les autres réponses.la source
gcc
prend en charge-std=c89
et-std=gnu89
et-std=c99
et-std=gnu99
(et les versions assez modernes prennent en charge-std=c11
et-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
).