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 ISO/IEC JTC 1/SC 22 /WG 14 de l' Organisation internationale de normalisation (ISO) et de la Commission électrotechnique internationale (IEC). 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 à ces normes, car cela favorise 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é ultérieurement adopté par l'ISO/IEC et que les révisions ultérieures publiées par l'ISO/IEC aient été adoptées par l'ANSI, « ANSI C » est toujours utilisé pour désigner 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.
Spécification informelle : K&R C (C78)
Spécification informelle en 1978 ( Brian Kernighan et Dennis Ritchie livre The C Programming Language ).
Normalisation du 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 de la norme C a été publiée en 1988, et parfois appelée C88 .
C89
La norme ANSI a été finalisée en 1989 et ratifiée sous le nom de ANSI X3.159-1989 « Langage de programmation C ». Cette version du langage est souvent appelée « ANSI C ». Plus tard, l'étiquette « C89 » est parfois utilisée pour la distinguer de la C90, mais en utilisant la même méthode d'étiquetage.
C90
La même norme que la norme C89 a été ratifiée par l'ISO/CEI sous le nom d'ISO/CEI 9899:1990, avec seulement des modifications de formatage, qui est parfois appelée C90. Par conséquent, les termes « C89 » et « C90 » font référence à un langage pratiquement identique.
Cette norme a été retirée par l'ANSI/INCITS et l'ISO/IEC.
C95
En 1995, l' ISO / CEI a publié une extension, appelée Amendement 1, pour la norme C. Son nom complet était finalement ISO/CEI 9899:1990/AMD1:1995 ou surnommé C95 . Outre la correction d'erreurs, d'autres modifications ont été apportées aux capacités du langage, telles que :
- Prise en charge améliorée des caractères multi-octets et larges dans la bibliothèque standard, introduction de
<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
andpour&& - Spécification de la macro standard
__STDC_VERSION__
En plus de l'amendement, deux rectificatifs techniques ont été publiés par l'ISO pour le C90 :
- ISO/CEI 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
#si défini(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L /* Code source compatible C95. */ #elif defined(__STDC__) /* Code source compatible C89. */ #endif
C99
En mars 2000, l'ANSI a adopté la norme ISO/IEC 9899:1999. Cette norme est communément appelée C99. Parmi les ajouts notables à la norme précédente, on peut citer :
- Nouveaux types de données intégrés :
long long,_Bool,_Complex, et_Imaginary - Plusieurs nouvelles fonctionnalités de base du langage, notamment des indices de tableau statiques, des initialiseurs désignés, des littéraux composés, des tableaux de longueur variable , des membres de tableau flexibles , des macros variadiques et
restrictdes mots-clés - Plusieurs nouveaux en-têtes de bibliothèque, notamment
stdint.h,<tgmath.h>,fenv.h,<complex.h> - Compatibilité améliorée avec plusieurs fonctionnalités C++ , notamment 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 identifiants - Suppression de plusieurs fonctionnalités dangereuses du langage C89 telles que les déclarations de fonctions implicites et implicites
int
Trois rectificatifs techniques ont été publiés par l'ISO pour la norme 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), remarquable pour déprécier la fonction de bibliothèque standard gets
Cette norme a été retirée par ANSI/INCITS et ISO/IEC au profit de la norme C11.
C11
La norme C11 a été officiellement ratifiée et publiée le 8 décembre 2011. Les fonctionnalités notables incluent une prise en charge améliorée d'Unicode , des expressions de type générique utilisant le nouveau mot-clé, une API multithread_Generic multiplateforme ( ) et la prise en charge des types atomiques à la fois dans le langage principal et dans la bibliothèque ( ). threads.hstdatomic.h
Un corrigendum technique a été publié par l'ISO pour C11 :
- ISO/CEI 9899:2011/Cor 1:2012
C17
Depuis octobre 2018 , « C17 » est la norme actuelle pour le langage de programmation C. [
C17 corrige les défauts de C11 sans introduire de nouvelles fonctionnalités linguistiques.
C23
C23 est le nom informel de la prochaine révision majeure de la norme du langage C.
Autres publications ISO connexes
Dans le cadre du processus de normalisation, l'ISO/CEI publie également des rapports techniques et des spécifications liés 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ées 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 intégré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 l'arithmétique binaire à virgule flottante compatible avec la norme IEC 60559:2011
- ISO/IEC TS 18661-2:2015, sur l'arithmétique à virgule flottante décimale compatible avec la norme IEC 60559:2011
- ISO/IEC TS 18661-3:2015, sur les types d'échange et de virgule flottante étendus compatibles avec la norme IEC 60559:2011
- ISO/IEC TS 18661-4:2015, sur les fonctions supplémentaires compatibles avec la norme 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 de la norme TS 18661, une spécification de mémoire transactionnelle logicielle et des extensions de bibliothèque parallèles.
Prise en charge des principaux compilateurs
Le C ANSI est désormais pris en charge par presque tous les compilateurs les plus utilisés. GCC et Clang sont deux compilateurs C majeurs populaires aujourd'hui, tous deux basés sur le C11 avec des mises à jour incluant des modifications provenant de spécifications ultérieures telles que C17. Tout code source écrit uniquement en C standard et sans aucune hypothèse dépendante du matériel est pratiquement assuré de compiler correctement sur n'importe quelle plate-forme avec une implémentation C conforme. Sans ces précautions, la plupart des programmes ne peuvent compiler que 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 d'interface utilisateur graphique , ou de la dépendance à des attributs spécifiques au compilateur ou à la plate-forme tels que la taille exacte de certains types de données et l'endianness 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 (« standard c ») peut être utilisée pour diviser le code en sections ANSI et K&R.
#si défini(__STDC__) && __STDC__ extern int getopt ( int , char * const * , const char * ); #sinon extern int getopt (); #endif
Dans l'exemple ci-dessus, un prototype est utilisé dans une déclaration de fonction pour les implémentations conformes à la norme ANSI, tandis qu'une déclaration non prototype obsolète est utilisée dans le cas contraire. Celles-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 une non-conformité à la norme ANSI.
Prise en charge du compilateur
Liste des compilateurs prenant en charge ANSI C :
- Acornsoft ANSI C (première version en 1988, révisée en 1989)
- Kit de compilation Amsterdam (C K&R et C89/90)
- ARM RealView
- Clang , utilisant le backend LLVM
- GCC (C89/90, C99 et C11 complets)
- Compilateur HP C/ANSI C (C89 et C99)
- IBM XL C/C++ (C11, à partir de la version 12.1)
- Le CCI d'Intel
- LabWindows/CVI
- LCC
- Oracle Developer Studio
- 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)
- Petit compilateur C (C89/90 et certains C99)