Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

C11 et les normes du langage C

Introduction

C avant C89

Le C est l’un des langages de programmation les plus utilisés en informatique. C’est aussi l’un des plus vieux. Il est apparu dans les laboratoires Bell en 1972. Ses deux auteurs, Dennis Ritchie et Ken Thompson, le développèrent en même temps que le système d’exploitation Unix. Brian Kernighan effectua quelques modifications avant la stabilisation du langage, marquée par la publication de son livre, en 1978, The C Programming Language (disponible en français sous le titre Le langage C, édition Masson). Dennis Ritchie avait participé à la rédaction de ce livre et l’a cosigné, notamment pour les exemples avec Unix et les annexes. Le C K&R (initiales des auteurs de ce livre) désigne d’ailleurs maintenant le langage C décrit par la première édition de cet ouvrage. 

C89, C ANSI et C ISO

Le langage C évolua ensuite, pour répondre en 1989 à la norme C89 mieux connue sous le nom de C ANSI, du nom de l’organisme qui y travailla (l’ANSI, ou Institut national américain de normalisation). Cette norme fut aussi adoptée par l’ISO l’année suivante sous le nom C90, plus connu sous C ISO, et plus précisément ISO/CEI 9899:1990.

Le C ANSI est très compatible avec le C K&R mais s’inspire par endroits...

Obtenir la norme C11

Problème

Vous souhaitez obtenir la norme C11. Vous voudriez pouvoir la lire en ligne sur Internet ou la télécharger.

Solution

Comme toute norme, vous pouvez obtenir ISO/CEI 9899:2011 auprès de l’organisme de normalisation de votre pays.

Cette norme est également disponible sur le site de l’ISO (http://www.iso.org).

Un document au stade de brouillon (draft) a servi à l’élaboration de la norme et il n’existe que quelques différences cosmétiques avec la norme. Vous pouvez le télécharger depuis http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf.

Discussion

Tout d’abord, signalons que cette norme est un document soumis au droit d’auteur (ou copyright selon les législations). Comme il est en vente sur le site de l’ISO et dans les organismes de normalisation des pays, vous ne devriez pas pouvoir l’obtenir gratuitement. Le plus simple est donc de le commander moyennant finance.

Vous trouverez par contre le document n1570.pdf à télécharger gratuitement. Les différences avec la norme sont peu nombreuses. En particulier, page 176, le brouillon indique que la constante __STDC_VERSION__ vaut 201ymmL. La norme aurait dû figer cette constante, par exemple à 201112L qui correspond à sa date de parution. Mais même à cet endroit, le brouillon et la norme sont identiques....

Programmer et compiler avec la norme C11

Problème

Vous voulez vous assurer que vous programmez bien en respectant la norme C11 et que votre compilateur est en mesure de compiler votre code.

Solution

Référez-vous au manuel de votre compilateur. Il s’agit de déterminer le paramètre à modifier pour indiquer la norme que votre compilateur doit respecter.

Notez que gcc et clang (llvm) implémentent tous deux la norme C11, au moins partiellement. Pour gcc, le paramètre est l’option --std.

Discussion

Si l’objectif est de compiler votre programme et que votre compilateur remplit cette tâche, vous n’avez peut-être pas besoin de vous poser trop de questions. En effet, à quelques exceptions près, un code en C89 ou C99 devrait compiler avec un compilateur C11.

À l’inverse, si votre code contient des spécificités de la norme C11, vous saurez rapidement si votre compilateur est en mesure de le compiler ou non. Dans la négative, renseignez-vous pour savoir s’il n’existe pas un paramètre permettant d’activer la norme C11. Ainsi, pour le compilateur gcc, vous devrez peut-être indiquer l’option --std=c11.

Par ailleurs, vous pourrez vous amuser à déterminer quelle norme respecte votre compilateur. Le code suivant peut vous y aider : il s’agit d’afficher la constante __STDC_VERSION__ qui vaut...

Principaux ajouts et modifications apportés par la norme C11

Problème

Vous programmez en C sans connaître ce qu’apporte la norme C11 par rapport au C que vous utilisez habituellement (habituellement C89, C ANSI ou C99). Vous voudriez savoir ce que la norme C11 contient et qui pourrait vous intéresser.

Solution

La norme répond à cette question dans l’avant-propos (foreword, pages xiii et xiv) dans une liste indiquant les changements principaux depuis la norme précédente. Le tout premier point de cette liste indique que certaines nouveautés sont optionnelles et que certains points antérieurs à C11 le deviennent également.

Reprenons les nouveautés de C11 en commençant par les points obligatoires.

  • Il est possible de connaître et de forcer l’alignement des objets en mémoire (<stdalign.h>, <stdlib.h>).

  • Gestion des chaînes et caractères Unicode (<uchar.h>) (apparu dans la norme ISO/IEC TR 19769:2004).

  • Macro _Generic(X) permettant de choisir une fonction selon le type de son argument.

  • Assertions statiques avec static_assert(). Cette macro prend deux arguments. Le premier, une constante (ou macro), représente l’assertion (comme pour assert()). Le second, une chaîne de caractères, également constante (statique), indique le message à afficher si l’assertion est fausse. Vous ne pouvez donc pas indiquer de variable ici. Un exemple d’utilisation serait static_assert(sizeof(long)==8, "Ne fonctionne qu’en 64bits") qui empêche l’exécution si un long ne vaut pas 8 octets (64 bits).

  • Structures et unions anonymes.

  • Fonctions sans retour.

  • Support de l’ouverture de fichiers avec accès exclusif.

  • Suppression de la fonction gets() (<stdio.h>). Nous expliquons dans le chapitre sur l’art de programmer en C pourquoi cette fonction était dangereuse. Elle n’existe maintenant plus.

  • Nouvelles fonctions aligned_alloc(), at_quick_exit() et quick_exit() (<stdlib.h>).

D’autres nouveautés ou améliorations sont facultatives :

  • Nouvelles macros pour créer des nombres complexes (<complex.h>).

  • Support des files d’exécution (thread...