URL: https://linuxfr.org/news/c11-nest-pas-encore-mort Title: C11 n'est pas encore mort Authors: GeneralZod Bruno Michel, Benoît Sibaud, baud123, Nÿco et claudex Date: 2011年12月26日T19:19:51+01:00 Tags: c, gcc, langage_c, dev, développement, dennis_ritchie et microsoft Score: 59 La dernière norme du langage C a été publiée le 8 décembre 2011, la pré-version finale étant accepté le 10 octobre, peu avant le décès du regretté Dennis Ritchie à l'origine du langage. C11 intègre principalement la gestion du multithreading et rend optionnelles certaines fonctionnalités afin de faciliter la conformité des compilateurs vis-à-vis de la norme. La précédente norme C99 a eu beaucoup de mal à s'imposer auprès de certains éditeurs, certains refusant même de l'implémenter (notamment un vendeur d'environnement Basic, situé à Redmond). ---- [Norme ISO/IEC 9899:2011](http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57853) [Pré-version finale (10 octobre 2011)](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) [DLFP : dépêche sur le décés de Dennis Ritchie](http://linuxfr.org/news/dennis%C2%A0ritchie-un-p%C3%A8re-d%E2%80%99unix-nous-a-quitt%C3%A9s) [C11 (wikipédia)](http://en.wikipedia.org/wiki/C1X) [Prise en charge de C11 dans GCC](http://gcc.gnu.org/gcc-4.6/changes.html) [Prise en charge de C11 dans Clang](http://clang.llvm.org/docs/LanguageExtensions.html#c11) ---- Les principaux changements par rapport à C99 : * possibilité d'aligner les structures : introduction des mot-clés `_Alignas` (spécifier l'alignement), `_Alignof` (récupérer l'alignement) (cf. entête ``) et apparition de la fonction `aligned_alloc` permettant d'allouer une structure tout en spécifiant l'alignement * gestion du multithreading : mot-clé `_Thread_local` pour spécifier la classe de stockage ([[Thread_Local_Storage]]), API pour créer, gérer les threads/mutex/conditions (cf. entête ``). Possibilité de gérer des opérations atomiques et introduction du mot-clé `_Atomic` pour spécifier les types atomiques (Cf. entête ``) * gestion des chaînes unicode : les types `char16_t` et `char32_t` permettent de stocker respectivement des chaînes UTF-16 et UTF32. On peut désormais préfixer les chaînes constantes par `u8`, `u`, `U` pour indiquer l'encodage utilisé (respectivement UTF-8, UTF-16, UTF-32). * l'infâme `gets` (obsolète en C99) à l'origine de nombreux _buffer overflows_ cède la place à `gets_s`, alternative plus sûre (car vérifiant les limites). * support des structures et unions anonymes, pratique pour les structures imbriquées. ```c // avant struct A { int a; struct { int b; int c; } B; }; ... A bidule; bidule.B.b = 3; // après struct A { int a; struct { int b; int c; }; }; ... A bidule; bidule.b = 3; ``` * sélection générique de fonctions : il est désormais possibilité de sélectionner dans une macro la fonction à exécuter en fonction du type des paramètres à l'aide du mot-clé `_Generic`. Dans l'exemple ci-dessous, la macro `cbrt(x)` exécutera la fonction `cbrtl` si x est de type double, `cbrtf` est de type float ou `cbrt` par défaut. ```c #define cbrt(X) _Generic((X), long double: cbrtl, \ default: cbrt, \ float: cbrtf)(X) ``` * introduction du mode create-and-open pour `fopen` (qualificatif 'x'), qui se comporte comme le mode POSIX `O_CREAT|O_EXCL`, utilisé entre autre par les fichiers verrou. * introduction de la fonction `quick_exit` (et de son homologue `at_quick_exit`) qui permet de quitter un programme en effectuant les déinitialisations requises quand exit échoue (seules les fonctions enregistrées par `at_quick_exit` sont exécutées). * une des critiques faites au C est le fait que celui-ci fasse confiance au programmeur pour vérifier que la taille des données allouées est suffisante, ce qui est source de nombreuses failles. Désormais, la bibliothèque standard offre des interfaces sûres pour ces fonctions. (cf. Annexe K de la norme) * une autre nouveauté pour encourager les vendeurs à prendre en charge la dernière norme est l'optionnalité de certaines parties de la norme. Sont optionnels : * les tableaux à longueurs variables, * la prise en charge des nombres complexes (obligatoires dans C99), * les interfaces sûres, * la prise en charge du multithreading, etc. La norme C11 est en cours d'implémentation dans GCC 4.6.x et suivants (switch `-std=c1x` ou `-std=gnu1x` pour inclure les extensions GNU) et CLang (switch `-std=c11`). Comme on peut le voir, C est un langage encore actif et qui a de beaux jours devant lui !

AltStyle によって変換されたページ (->オリジナル) /