ANSI C - ANSI C
révisions en langage C |
---|
ANSI C , ISO C et Standard C sont des normes successives pour le langage de programmation C publiées par l' American National Standards Institute (ANSI) et l' Organisation internationale de normalisation (ISO). Historiquement, les noms faisaient spécifiquement référence à la version originale et la mieux prise en charge de la norme (connue sous le nom de C89 ou C90 ). Les développeurs de logiciels écrivant en C sont encouragés à se conformer aux normes, car cela facilite la portabilité entre les compilateurs.
Histoire et perspectives
La première norme pour C a été publiée par l'ANSI. Bien que ce document ait été adopté par la suite par l'Organisation internationale de normalisation (ISO) et que les révisions ultérieures publiées par l'ISO aient été adoptées par l'ANSI, « ANSI C » est toujours utilisé pour faire référence à la norme. Alors que certains développeurs de logiciels utilisent le terme ISO C, d'autres sont neutres vis-à-vis des organismes de normalisation et utilisent la norme C.
Normalisation C
En 1983, l'American National Standards Institute a formé un comité, X3J11, pour établir une spécification standard de C. En 1985, le premier projet de norme a été publié, parfois appelé C85 . En 1986, un autre projet de norme a été publié, parfois appelé C86 . La version préliminaire du Standard C a été publiée en 1988, et parfois appelée C88 .
C89
La norme ANSI a été achevée en 1989 et ratifiée en tant que ANSI X3.159-1989 « langage de programmation C ». Cette version du langage est souvent appelée "ANSI C". Plus tard, parfois, l'étiquette "C89" est utilisée pour le distinguer du C90 mais en utilisant la même méthode d'étiquetage.
C90
La même norme que C89 a été ratifiée par l'Organisation internationale de normalisation en tant qu'ISO/IEC 9899:1990, avec uniquement des modifications de formatage, parfois appelées C90. Par conséquent, les termes "C89" et "C90" se réfèrent essentiellement à la même langue.
Cette norme a été retirée à la fois par ANSI/INCITS et ISO/IEC.
C95
En 1995, l' ISO a publié une extension, appelée Amendement 1, pour la norme ANSI-C. Son nom complet était finalement ISO/IEC 9899:1990/AMD1:1995 ou surnommé C95 . Outre la correction des erreurs, d'autres modifications ont été apportées aux capacités linguistiques, telles que :
- Prise en charge améliorée des caractères multi-octets et larges dans la bibliothèque standard, introduisant
<wchar.h>
et<wctype.h>
ainsi que des E/S multi-octets - Ajout de digrammes à la langue
- Spécification de macros standard pour la spécification alternative d'opérateurs, par exemple
and
pour&&
- Spécification de la macro standard
__STDC_VERSION__
En plus de l'amendement, deux rectificatifs techniques ont été publiés par l'ISO pour C90 :
- ISO/IEC 9899:1990/Cor 1:1994 TCOR1 en 1994
- ISO/CEI 9899:1990/Cor 2:1996 en 1996
Test de préprocesseur pour la compatibilité C95
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L
/* C95 compatible source code. */
#elif defined(__STDC__)
/* C89 compatible source code. */
#endif
C99
En mars 2000, l'ANSI a adopté la norme ISO/IEC 9899:1999. Cette norme est communément appelée C99. Voici quelques ajouts notables à la norme précédente :
- Nouveaux types de données intégrés :
long long
,_Bool
,_Complex
, et_Imaginary
- Plusieurs nouvelles fonctionnalités du langage de base, y compris les indices de tableau statiques, les initialiseurs désignés, les littéraux composés, les tableaux de longueur variable , les membres de tableau flexibles , les macros variadiques et les
restrict
mots - clés - Plusieurs nouveaux en-têtes de bibliothèque, y compris
stdint.h
,<tgmath.h>
,fenv.h
,<complex.h>
- Compatibilité améliorée avec plusieurs fonctionnalités C++ , y compris les fonctions en ligne , les commentaires sur une seule ligne avec
//
, le mélange de déclarations et de code et les noms de caractères universels dans les identificateurs - Suppression de plusieurs fonctionnalités dangereuses du langage C89 telles que les déclarations de fonction implicites et implicites
int
Trois rectificatifs techniques ont été publiés par l'ISO pour C99 :
- ISO/CEI 9899:1999/Cor 1:2001(F)
- ISO/CEI 9899:1999/Cor 2:2004(F)
- ISO/IEC 9899:1999/Cor 3:2007(E), notable pour la dépréciation de la fonction de bibliothèque standard obtient
Cette norme a été retirée à la fois par ANSI/INCITS et ISO/IEC en faveur de C11.
C11
C11 a été officiellement ratifié et publié le 8 décembre 2011. Les fonctionnalités notables incluent une prise en charge améliorée d' Unicode , des expressions génériques de type utilisant le nouveau _Generic
mot-clé, une API multi-threading multiplateforme ( threads.h
) et la prise en charge des types atomiques à la fois dans le langage de base et dans la bibliothèque. ( stdatomic.h
).
Un rectificatif technique a été publié par l'ISO pour C11 :
- ISO/CEI 9899:2011/Cor 1:2012
C17
En Octobre 2018, « C17 » est le courant norme pour le langage de programmation C .
C17 corrige les défauts de C11 sans introduire de nouvelles fonctionnalités linguistiques.
C2x
C2x est un nom informel pour la prochaine révision majeure de la norme du langage C (après C17 ) .
Dans le cadre du processus de normalisation, l'ISO publie également des rapports techniques et des spécifications liées au langage C :
- ISO/IEC TR 19769:2004, sur les extensions de bibliothèque pour prendre en charge les formats de transformation Unicode, intégrés dans C11
- ISO/IEC TR 24731-1:2007, sur les extensions de bibliothèque pour prendre en charge les interfaces à limites vérifiées, intégrées dans C11
- ISO/IEC TR 18037:2008, sur les extensions C embarquées
- ISO/IEC TR 24732:2009, sur l' arithmétique décimale à virgule flottante , remplacée par ISO/IEC TS 18661-2:2015
- ISO/IEC TR 24747:2009, sur les fonctions mathématiques spéciales,
- ISO/IEC TR 24731-2:2010, sur les extensions de bibliothèque pour prendre en charge les fonctions d'allocation dynamique
- ISO/IEC TS 17961:2013, sur le codage sécurisé en C
- ISO/IEC TS 18661-1:2014, sur IEC 60559:2011 -arithmétique binaire à virgule flottante compatible
- ISO/IEC TS 18661-2:2015, sur l' arithmétique décimale à virgule flottante compatible IEC 60559:2011
- ISO/IEC TS 18661-3:2015, sur l'échange compatible IEC 60559:2011 et les types étendus à virgule flottante
- ISO/IEC TS 18661-4:2015, sur les fonctions supplémentaires compatibles IEC 60559:2011
D'autres spécifications techniques sont en cours de développement et en attente d'approbation, notamment la cinquième et dernière partie du TS 18661, une spécification de mémoire transactionnelle logicielle et des extensions de bibliothèque parallèle.
Prise en charge des principaux compilateurs
ANSI C est maintenant pris en charge par presque tous les compilateurs largement utilisés. GCC et Clang sont deux compilateurs C majeurs populaires aujourd'hui, tous deux basés sur le C11 avec des mises à jour comprenant des modifications par rapport aux spécifications ultérieures telles que C17 et C18. Tout code source écrit uniquement en C standard et sans aucune hypothèse dépendante du matériel est pratiquement garanti de se compiler correctement sur n'importe quelle plate-forme avec une implémentation C conforme. Sans de telles précautions, la plupart des programmes peuvent compiler uniquement sur une certaine plate-forme ou avec un compilateur particulier, en raison, par exemple, de l'utilisation de bibliothèques non standard, telles que les bibliothèques GUI , ou de la dépendance à l'égard d'attributs spécifiques au compilateur ou à la plate-forme. tels que la taille exacte de certains types de données et le caractère endian des octets .
Détectabilité de la conformité
Pour atténuer les différences entre K&R C et la norme ANSI C, la __STDC__
macro (" c standard ") peut être utilisée pour diviser le code en sections ANSI et K&R.
#if defined(__STDC__) && __STDC__
extern int getopt(int, char * const *, const char *);
#else
extern int getopt();
#endif
Dans l'exemple ci-dessus, un prototype est utilisé dans une déclaration de fonction pour les implémentations conformes à l'ANSI, tandis qu'une déclaration de non-prototype obsolète est utilisée dans le cas contraire. Ceux-ci sont toujours conformes à la norme ANSI à partir de C99. Notez comment ce code vérifie à la fois la définition et l'évaluation : cela est dû au fait que certaines implémentations peuvent être définies __STDC__
sur zéro pour indiquer la non-conformité ANSI.
Compilateurs prenant en charge ANSI C
- Kit de compilation Amsterdam (C K&R et C89/90)
- ARM RealView
- Clang , en utilisant le backend LLVM
- GCC (complet C89/90, C99 et C11)
- Compilateur HP C/ANSI C (C89 et C99)
- IBM XL C/C++ (C11, à partir de la version 12.1)
- ICC d'Intel
- LabWindows/CVI
- LCC
- OpenWatcom (C89/90 et certains C99)
- Microsoft Visual C++ (C89/90 et certains C99)
- Pelles C (C99 et C11. Windows uniquement.)
- vbcc (C89/90 et C99)
- Compilateur Tiny C (C89/90 et certains C99)
- Studio de développement Oracle
Voir également
- Langage de description comportementale
- Compatibilité C et C++
- C++17 , C++14 , C++11 , C++03 , C++98 , versions du langage de programmation C++ standard
- Rapport technique C++ 1
Les références
- ^ Brad Kelechava (2017-09-14). "L'origine de l'ANSI C et de l'ISO C" . Récupéré le 2018-08-14 .
- ^ Richard Hale Shaw (septembre 1988). "Norme C : Le Projet ANSI Grandit". Revue PC . Vol. 7 non. 15. p. 116-117.
- ^ "Normes - Utilisation de la collection de compilateurs GNU (GCC)" . Récupéré le 2012-06-24 .
- ^ "INCITS/ISO/IEC 9899" . www.techstreet.com . Récupéré le 03/10/2018 .
- Sauter^ "ISO/IEC 9899:1990 - Langages de programmation -- C" . Récupéré le 2012-06-24 .
- ^ Clive DW Plume (2010-09-12). "Une brève description de l'Addendum Normatif 1" .
- Sauter^ "ISO/IEC 9899:1990/Amd 1:1995" . Organisation internationale de normalisation. 2013-03-22.
- Sauter^ "ISO/CEI 9899:1990/Cor 1:1994" . ISO . Récupéré le 21/01/2019 .
- Sauter^ "ISO/CEI 9899:1990/Cor 2:1996" . ISO . Récupéré le 21/01/2019 .
- ^ 14h00-17h00. "ISO/CEI 9899:1999" . ISO . Récupéré le 21/01/2019 .CS1 maint : noms numériques : liste des auteurs ( lien )
- ^ "INCITS/ISO/IEC 9899-2012" . ANSI.
- Sauter^ "ISO/IEC 9899:1999 - Langages de programmation -- C" . Récupéré le 2012-06-24 .
- Sauter^ "ISO/IEC 9899:2011/Cor 1:2012" . Organisation internationale de normalisation.
- ^ "ISO/IEC 9899:2018 - Technologies de l'information - Langages de programmation - C" . www.iso.org .
- ^ "La Norme - C" . www.iso-9899.info .
- ^ "Histoire de C" . cpreference .
- Sauter^ "ISO/CEI TR 19769:2004" . Organisation internationale de normalisation.
- Sauter ^ "ISO/CEI TR 24731-1:2007" . Organisation internationale de normalisation.
- Sauter ^ "ISO/CEI TR 18037:2008" . Organisation internationale de normalisation.
- Sauter^ "ISO/CEI TR 24732:2009" . Organisation internationale de normalisation.
- Sauter ^ "ISO/CEI TR 24747:2009" . Organisation internationale de normalisation.
- ^ "ISO/CEI TR 24731-2:2010" . Organisation internationale de normalisation.
- ^ "ISO/CEI TS 17961:2013" . Organisation internationale de normalisation.
- ^ "ISO/CEI TS 18661-1:2014" . Organisation internationale de normalisation.
- ^ "ISO/CEI TS 18661-2:2015" . Organisation internationale de normalisation.
- ^ "ISO/CEI TS 18661-3:2015" . Organisation internationale de normalisation.
- ^ "ISO/CEI TS 18661-4:2015" . Organisation internationale de normalisation.
- ^ Voir une liste sur https://en.cppreference.com/w/c/experimental Visité le 16 janvier 2016.
- ^ "Utilisation de la collection de compilateurs GNU (GCC) : normes" . gcc.gnu.org . Récupéré le 2019-02-05 .
- ^ "Compatibilité linguistique" . clang.llvm.org . Récupéré le 2019-02-05 .
- ^ "Noms de macro prédéfinis standard" . www.ibm.com . Récupéré le 2019-04-10 .
- ^ "Pack développeur HP C/ANSI C" . Récupéré le 2015-07-12 .
- ^ Prise en charge d'ISO C11 ajoutée aux compilateurs IBM XL C/C++
- ^ lien vers les pages Pelles C
Lectures complémentaires
- Schreiner, Axel-Tobias (1993). Programmation Orientée Objet avec ANSI-C . Hanser. ISBN 3-446-17426-5.
Liens externes
- Groupe de travail ISO C
- Projet de norme ANSI C (ANSI X3J11/88-090) (13 mai 1988), troisième examen public
- Ébauche de justification ANSI C (ANSI X3J11/88-151) (18 novembre 1988)
- C Bulletin d'information #1 (ANSI X3J11/93-007) (27 mai 1992)
- Grammaire ANSI C Yacc
- "ISO/IEC 9899:1999 Langages de programmation -- C" . Institut national américain de normalisation. Archivé de l'original le 2011-07-25 . Récupéré le 2009-08-06 .
- " ANSI Standards Action Vol. 36, # 48 " (PDF) . Institut national américain de normalisation. 2005-12-02. Archivé de l'original (PDF) le 04/03/2016 . Récupéré le 2009-08-06 .