Cours sur les nouveautés du C99, tutoriel & guide de travaux pratiques en pdf.
Les fonctions en ligne
Le mot-clé inline est un nouvel attribut pour les fonctions qui ont pour but de remplacer le système de macro défini grâce à la commande du préprocesseur #define. Pour illustrer l’avantage de cette méthode 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 parenthèses autour de la variable a, la macro peut produire un résultat inattendu, il faut aussi faire attention au effets de bord puisque la variable a est évaluée deux fois. Maintenant avec le mécanisme de fonction en ligne :
inline int carre (int a) { return a*a; } int main (void) { int b = carre (5); printf (« Le carre de 5 est %d\n », b); return 0; }
Ceci supprime les dangers liés à l’utilisation de l’instruction #define. Les fonctions en ligne doivent être définies aux mêmes endroits que les macros classiques, ce qui peut alourdir les fichiers d’en-tête et surtout recopie la fonction dans plusieurs fichiers sources : pour éviter de se retrouver avec plusieurs fonctions globales portant le même nom, il est conseillé de toujours utiliser le mot-clé inline conjointement avec le mot-clé static (même dans un fichier d’en-tête).
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.
long long
Le nouveau type d’entier long long (signé ou non) est représenté sur au moins 64 bits. Il s’accompagne des notation LL (ou ll) et ULL (ou ull).
__func__
La variable __func__ (3) contient le nom de la fonction courante. Elle est déclarée ainsi :
static const char __func__[];
Type de retour implicite
En C90, en l’absence de type de retour, le compilateur considère que cette fonction retourne un int, en C99 ce n’est plus possible : le type de retour doit être spécifié.
Les nouveautés du C99 par Nicolas Joseph (home) (Blog)
Les pointeurs restreints
Le mot-clé restrict permet de spécifier qu’un pointeur est le seul à pointer sur une zone mémoire. Cela permet au compilateur d’opérer certaines optimisations. Par exemple, la fonction memcpy qui est utilisée pour copier deux zones de mémoires qui ne se chevauchent pas peut avoir comme prototype, en C99 :
void *memcpy (void *restrict dst, const void *restrict src, size_t size);
Le mot-clé ce place entre le caractère * et le nom du pointeur.
Comme pour les fonctions en ligne, cette directive peut être ignorée par le compilateur.