Cela fait maintenant plusieurs années que le comité de normalisation du langage C travaille sur la remplaçante de l'actuelle norme C99. Cette dernière n'a pas connu un franc succès (en témoigne
le peu de compilateur supportant entièrement cette norme) notamment à cause du refus de Microsoft de supporter cette dernière, mais aussi à cause de certaines difficultés techniques (les tableaux de longueur variable par exemple). Aussi était-il important de corriger le tir avec une nouvelle norme, ce qui est désormais chose faite.
Les nouveautés
La nouvelle norme porte le nom de C11 et inclus bon lots de nouveautés. Parmi celles-ci, on peut notamment citer :
Support optionnel du multithreading
Deux nouveaux en-têtes threads.h et stdatomic.h font leurs apparitions et déclarent une multitude de fonctions permettant la gestion des threads ainsi que des mutex.
Possibilité d'obtenir et de spécifier l'alignement des objets
Pour ceux qui ne le savent pas, l'alignement consiste à placer certains objets à une adresse multiple d'un certain nombre. Cet alignement est parfois nécessaire afin d'éviter des erreurs, mais est aussi parfois utilisé dans un but d'optimisation.
Jusqu'à présent, il était nécessaire de passer par l'Assembleur pour connaître l'alignement d'un objet ou pour le modifier. Désormais, il est possible d'utiliser le mot-clé
_Alignof pour obtenir l'alignement d'un objet et le mot-clé
_Alignas pour spécifier l'alignement d'un objet lors de sa définition (il est également possible d'utiliser les macros
alignof et
alignas définies dans le nouvel en-tête stdalign.h). De même, la nouvelle fonction
aligned_alloc permet d'allouer dynamiquement un objet respectant un certain alignement spécifié en argument.
Nouvelles fonctions pour le support de l'Unicode
Le nouvel en-tête uchar.h défini deux nouveaux types :
char16_t et
char32_t permettant de stocker des caractères encodés respectivement en UTF_16 et UTF_32 et des fonctions de conversions permettant de traiter avec ces derniers. De plus, il est possible de spécifier l'encodage des chaînes littérales en les précédant de u8, u ou U (pour UTF-8, UTF-16 et UTF-32).
Les sélections génériques
Les sélections génériques peuvent être vues comme des
switch qui effectuent des remplacements suivant le type d'une expression. Un exemple sera je pense plus parlant :
Code : C | #define sqrt(X) _Generic((X), \
long double: sqrtl, \
default: sqrt, \
float: sqrtf \
)(X)
|
L'en-tête math.h déclare trois fonctions permettant de calculer la racine carrée d'un nombre :
sqrtf,
sqrt et
sqrtl. Ces trois fonctions sont identiques, mise à part qu'elles attendent respectivement un argument de type
float,
double et
long double. Afin d'uniformiser l'appel, on défini une macro
sqrt utilisant une sélection générique.
Comment cela fonctionne-t-il ? Hé bien, suivant le type de l'expression passée comme premier argument de
_Generic (ici il s'agit de l'argument passé à la macro), l'expression
_Generic(/* ... */)(X) sera remplacée par
sqrtl(X),
sqrt(X) ou
sqrtl(X).
Support des structures et unions anonymes
Jusqu'à présent, lorsque vous définissiez une structures ou une union dans une autre, il vous était nécessaire de la nommer. Par exemple comme ceci :
Code : C | struct une {
int x;
struct {
int y;
int z;
} deux;
};
|
et donc d'accéder aux champs de cette dernière comme cela :
Code : C | test.x = 10;
test.deux.y = 20;
test.deux.z = 30;
|
Cela n'est désormais plus nécessaire et il est donc possible de procéder comme suit :
Code : C | struct une {
int x;
struct {
int y;
int z;
};
};
|
Code : C | test.x = 10;
test.y = 20;
test.z = 30;
|
Mode d'ouverture exclusif
Un nouveau mode d'ouverture des fichiers fait son apparition, le mode exclusif (
"x"). Ce dernier n'est utilisable qu'en combinaison avec le mode
"w" et permet, entre autre, de faire échouer l'ouverture si le fichier à créer existe déjà. Cette fonctionnalité est très utile pour mettre en place des verrous entre différents programmes.
Suppression de la fonction gets
La fonction
gets, connue pour son défaut de sécurité, ne fait désormais plus partie des fonctions standards. Une remplaçante nommée
gets_s est proposée dans l'annexe K, mais elle ne fait pas officiellement partie de la liste des fonctions standards.
Support optionnel des tableaux de longueur variable et des nombres complexes
Le support des tableaux de longueur variable (c'est-à-dire dont la taille est spécifiée par une variable) et des nombres complexes n'est désormais plus obligatoire comme en C99, mais optionnel.
Conclusion
Ceci n'est qu'un aperçu des nouveautés apportées par la norme, il y en a bien entendu d'autre.
Il reste désormais aux différents compilateurs et aux différentes bibliothèques C à implémenter ces nouvelles fonctionnalités. Ce travail a déjà commencé
pour GCC ainsi que
pour Clang, bien que pour l'instant cela ne soit encore que des ébauches. Toutefois, si vous souhaitez déjà bénéficier de ces avancées, il vous suffit de disposer de leur dernière version et de compiler avec l'option
-std=c11 ou
-std=c1x.
Espérons que cette nouvelle norme connaîtra un meilleur succès que la précédente.
Sources et liens
79 Participations
Connectez-vous !
Connectez-vous !
Revenir à la liste des news
Lire aussi