Académique Documents
Professionnel Documents
Culture Documents
Au travers de cet article, je vous propose un tour d'horizon des nouveauts du C99.
Historique..................................................................................................................................................................... 3
I - Introduction..............................................................................................................................................................4
II - Prprocesseur........................................................................................................................................................ 5
II-A - La macro __STDC_VERSION__.................................................................................................................. 5
II-B - Macros nombre variable d'arguments....................................................................................................... 5
II-C - Les commentaires mono-ligne......................................................................................................................5
II-D - La directive #line...........................................................................................................................................5
II-E - La directive #pragma.................................................................................................................................... 5
III - Syntaxe..................................................................................................................................................................6
III-A - Les nouveaux mots rservs.......................................................................................................................6
III-B - Squences d'chappement deux caractres............................................................................................6
III-C - Mlange dclaration/code............................................................................................................................ 6
III-D - Initialisation des membres d'une structure.................................................................................................. 6
IV - Smantique........................................................................................................................................................... 8
IV-A - Les fonctions en ligne................................................................................................................................. 8
IV-B - long long...................................................................................................................................................... 8
IV-C - __func__...................................................................................................................................................... 8
IV-D - Type de retour implicite...............................................................................................................................8
IV-E - Les pointeurs restreints............................................................................................................................... 9
IV-F - Les tableaux de taille variable.....................................................................................................................9
IV-G - Type de tableau incomplet........................................................................................................................ 10
V - La bibliothque standard..................................................................................................................................... 12
V-A - Les nouveaux fichiers d'en-tte..................................................................................................................12
V-B - Les types entiers tendus.......................................................................................................................... 12
V-C - Les caractres tendus.............................................................................................................................. 12
V-D - va_copy.......................................................................................................................................................12
V-E - Le type boolen..........................................................................................................................................13
V-F - Les nombres complexes.............................................................................................................................13
V-G - Les nombres virgules flottantes.............................................................................................................. 13
V-G-1 - Dpassement de capacit de la valeur de retour............................................................................. 13
V-G-2 - Le controle des arrondis....................................................................................................................14
V-G-3 - Les exceptions...................................................................................................................................14
V-G-4 - Manipulation de l'environnement....................................................................................................... 15
VI - Conclusion.......................................................................................................................................................... 16
VII - Rfrences.........................................................................................................................................................17
VIII - Remerciements................................................................................................................................................. 18
-2Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
Historique
4 Novembre 2006
-3Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
I - Introduction
A l'heure actuelle, deux normes cohabitent : il y a celle publie en 1989 par l'ANSI (1) , reprise en 1990 par l'ISO
(2) connue respectivement sous le nom de C89 et C90 (ce sont les mmes) et une seconde norme, qui regroupe
les diffrents drafts apparues depuis la dernire norme, publie en 1999 par ISO connue sous le nom de C99 (et
C2k pour la version ANSI). Cette dernire a pour but de minimiser les incompatibilits entre le C et le C++ (sans
pour autant en faire un seul et mme langage). Voici donc la liste des nouveauts et des modifications apportes
par la norme C99 par rapport au C90.
-4Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
II - Prprocesseur
II-A - La macro __STDC_VERSION__
Cette macro permet de connatre la norme utilise :
Chacune de ces fonctionnalits peuvent tre active (ON), dsactive (OFF) ou remis son tat par dfaut
(DEFAULT). Par exemple, voici comment activer les optimisations des expressions flottantes :
#pragma STDC FP_CONTRACT ON
-5Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
III - Syntaxe
III-A - Les nouveaux mots rservs
Le C99 ajoute cinq mots rservs au langage :
restrict
inline
_Complex
_Imaginary
_Bool
Cependant ce genre de mlange n'est pas recommand afin de prserver la lisibilit du code.
Cette fonctionnalit entrane la possibilit de crer une variable de boucle temporaire pour l'instruction for :
for (int i = 0; i < 10; i++)
{
/* variable i utilisable */
}
/* variable i inexistante */
Est quivalent :
{
int i;
for (i = 0; i < 10; i++)
{
/* variable i utilisable */
}
}
/* variable i inexistante */
De plus, pour les structures de type auto, il est possible d'initialiser les membres avec des valeurs non connues au
moment de la compilation :
int i = 0;
struct T s1 = {.a = i, .b = i+2};
-7Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
IV - Smantique
IV-A - Les fonctions en ligne
Le mot-cl inline est un nouvel attribut pour les fonctions qui ont pour but de remplacer le systme de macro dfini
grce la commande du prprocesseur #define. Pour illustrer l'avantage de cette mthode par rapport aux macros,
voici l'exemple classique du calcul du carr d'un nombre :
#define carre(a) ((a)*(a))
Si par malheur vous oubliez les parenthses autour de la variable a, la macro peut produire un rsultat inattendu, il
faut aussi faire attention au effets de bord puisque la variable a est value deux fois. Maintenant avec le mcanisme
de fonction en ligne :
inline int carre (int a)
{
return a*a;
}
int main (void)
{
int b = carre (5);
Ceci supprime les dangers lis l'utilisation de l'instruction #define. Les fonctions en ligne doivent tre dfinies aux
mmes endroits que les macros classiques, ce qui peut alourdir les fichiers d'en-tte et surtout recopie la fonction dans
plusieurs fichiers sources : pour viter de se retrouver avec plusieurs fonctions globales portant le mme nom, il est
conseill de toujours utiliser le mot-cl inline conjointement avec le mot-cl static (mme dans un fichier d'en-tte).
L'attribut inline est une information d'optimisation pour le compilateur, si la mise en ligne
n'est pas possible, le compilateur peut ignorer cet attribut.
IV-C - __func__
La variable __func__ (3) contient le nom de la fonction courante. Elle est dclare ainsi :
static const char __func__[];
-8Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
Comme toutes variables automatiques, elles sont dtruites la fin du bloc dans lequel elles sont dclares (plus
de fuites mmoires avec ce systme), en contre partie l'allocation dynamique reste indispensable pour retourner
l'adresse d'une zone mmoire.
On peut aussi dclarer un tableau de taille variable dans le prototype d'une fonction :
void foo (int n, int a[n]) { ... }
Il faut que la variable n soit dfinie avant, ce qui interdit d'crire ceci :
void foo (int a[n], int n) { ... }
Les tableaux de tailles variables sont limits au fichier, il n'est pas possible d'utiliser le mot-cl extern :
extern int n;
int a[n]; /* n est declaree extern : utilisation interdite */
extern int b[n]; /* utilisation interdite */
-9Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
Il n'est pas possible de crer de tel tableau static. Par contre il est possible de dclarer static un pointeur sur
VLA :
int b[10];
start :
/* ... */
goto end; /* Authorise */
}
end :
/* ... */
- 10 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
Cela vite d'utiliser un pointeur pour tab et d'avoir une allocation supplmentaire faire. Hlas il n'est pas possible
de faire :
struct incomplet a = {3, 0, 1, 2};
struct incomplet b = {5, 0, 1, 2, 3, 4};
- 11 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
V - La bibliothque standard
V-A - Les nouveaux fichiers d'en-tte
Un enrichissement de la bibliothque standard, s'accompagne logiquement de nouveaux fichiers d'en-tte :
complex.h
fenv.h
inttypes.h
iso646.h
stdbool.h
stdint.h
tgmath.h
wchar.h
wctype.h
intN_t
uintN_t
intmax_t
uintmax_t
int_leastN_t
Types
uint_leastN_t
int_fastN_t
uint_fastN_t
Description
Entier sign de N (8, 16, 32 ou 64 (4) ) bits
Entier non sign de N (8, 16, 32 ou 64) bits
Entier sign de taille maximale
Entier non sign de taille maximale
Entier sign d'au moins N (8, 16, 32 ou
64)bits
Entier non sign d'au moins N (8, 16, 32 ou
64) bits
Entier rapide (5) sign d'au moins N (8, 16,
32 ou 64) bits
Entier rapide non sign d'au moins N (8, 16,
32 ou 64) bits
Ces types sont nots comme optionnels dans la norme, par consquent leur portabilit
est rduite.
V-D - va_copy
Le fichier d'en-tte stdarg.h contient une nouvelle fonction va_copy qui permet de copier un objet de type va_list.
- 12 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
Pour construire un nombre complexe, il suffit d'additionner sa partie relle et sa partie imaginaire :
double partie_reelle = 2.0;
double partie_imaginaire = 3.0;
double complex z = partie_reelle + partie_imaginaire * I;
La bibliothque standard du C99 propose aussi des fonctions pour calculer le module (cabs*), l'argument (carg*) et
la reprsentation selon la projection sur la sphre de Riemann (cproj*) d'un nombre complexe.
Et de le modifier grce :
int fesetround (int mode);
O exceptions peut tre une combinaison des macros prcdentes (grce un ou binaire |) et la fonction retourne
les exceptions rellement leves parmis celles passes en argument (ou zro si aucune n'est leve).
Vous pouvez lever une ou plusieurs exceptions grce :
void feraiseexcept (int exceptions);
- 14 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
La fonction fesetenv peut pendre en argument la valeur FE_DFL_ENV qui permet de restaurer l'tat initial de
l'environnement.
void feupdateenv (const fenv_t *ecf);
- 15 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
VI - Conclusion
Voil, notre petit tour des nouveauts du C99 est termin ! Je n'ai fait que vous prsenter les nouveauts les plus
importantes et sans approfondir, volontairement, certains points. Par exemple les nombres flottants ou les caractres
tendus ncessiteraient un article entier, si le coeur vous en dit : http://club.developpez.com/redaction/ ;).
Cependant l'heure actuelle, il n'est pas recommand d'utiliser les spcificits de cette nouvelle norme puisqu'elle
n'est pas encore intgralement implmente dans tous les compilateurs (par exemple pour gcc : Status of C99
features in GCC). Il existe tout de mme certains compilateurs conformes la norme C99 (6) :
- 16 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
VII - Rfrences
Si vous souhaitez en savoir plus sur ce sujet, vous pouvez tlcharger gratuitement la dernire version de la norme
au format pdf : n1124.pdf.
Je vous conseille aussi la lecture de deux trs bons livres qui abordent le sujet : mthodologie de la programmation
en C et C prcis et concis.
- 17 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
VIII - Remerciements
Merci fearyourself, neguib et Yogui pour leur relecture attentive de cet article.
- 18 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/
- 19 Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de
ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2006-2008 - Nicolas Joseph. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://nicolasj.developpez.com/articles/c99/