inline function specifier
Déclare une fonction inline .
Table des matières |
Syntaxe
| inline function_declaration | (depuis C99) | ||||||||
Explication
L'intention du spécificateur
inline
est de servir d'indication au compilateur pour effectuer des optimisations, telles que
l'inlining de fonction
, qui nécessitent généralement que la définition d'une fonction soit visible au site d'appel. Les compilateurs peuvent (et le font généralement) ignorer la présence ou l'absence du spécificateur
inline
à des fins d'optimisation.
Si le compilateur effectue l'inlining de fonction, il remplace un appel de cette fonction par son corps, évitant ainsi la surcharge d'un appel de fonction (placement des données sur la pile et récupération du résultat), ce qui peut entraîner un exécutable plus volumineux car le code de la fonction doit être répété plusieurs fois. Le résultat est similaire aux macros de type fonction , sauf que les identifiants et macros utilisés dans la fonction se réfèrent aux définitions visibles au point de définition, et non au point d'appel.
Indépendamment de la réalisation de l'inlining, la sémantique suivante des fonctions inline est garantie :
Toute fonction ayant une liaison interne peut être déclarée
static inline
sans autres restrictions.
Une fonction inline non statique ne peut pas définir un statique non constant local à la fonction et ne peut pas faire référence à un statique de portée de fichier.
static int x; inline void f(void) { static int n = 1; // erreur : static non-const dans une fonction inline non-statique int k = x; // erreur : fonction inline non-statique accède à une variable statique }
Si une fonction non statique est déclarée
inline
, alors elle doit être définie dans la même unité de traduction. La définition inline qui n'utilise pas
extern
n'est pas visible extérieurement et n'empêche pas d'autres unités de traduction de définir la même fonction. Cela fait du mot-clé
inline
une alternative à
static
pour définir des fonctions dans les fichiers d'en-tête, qui peuvent être inclus dans plusieurs unités de traduction du même programme.
Si une fonction est déclarée
inline
dans certaines unités de traduction, elle n'a pas besoin d'être déclarée
inline
partout : au plus une unité de traduction peut également fournir une fonction régulière, non-inline non-statique, ou une fonction déclarée
extern inline
. Cette unité de traduction est dite fournir la
définition externe
. Afin d'éviter un comportement indéfini, une définition externe doit exister dans le programme si le nom de la fonction avec liaison externe est utilisé dans une expression, voir
règle de définition unique
.
L'adresse d'une fonction inline avec liaison externe est toujours l'adresse de la définition externe, mais lorsque cette adresse est utilisée pour effectuer un appel de fonction, il n'est pas spécifié si la définition inline (si présente dans l'unité de traduction) ou la définition externe est appelée. Les objets statiques définis dans une définition inline sont distincts des objets statiques définis dans la définition externe :
inline const char *saddr(void) // la définition inline pour utilisation dans ce fichier { static const char name[] = "saddr"; return name; } int compare_name(void) { return saddr() == saddr(); // comportement non spécifié, un appel pourrait être externe } extern const char *saddr(void); // une définition externe est également générée
Un programme C ne doit pas dépendre de la version en ligne ou de la version externe d'une fonction appelée, sinon le comportement n'est pas spécifié.
Mots-clés
Notes
Le mot-clé
inline
a été adopté à partir du C++, mais en C++, si une fonction est déclarée
inline
, elle doit être déclarée
inline
dans chaque unité de traduction, et chaque définition d'une fonction inline doit être exactement la même (en C, les définitions peuvent être différentes, et selon les différences, cela ne conduit qu'à un comportement non spécifié). D'autre part, le C++ autorise les statiques non constantes locales aux fonctions et toutes les statiques locales aux fonctions provenant de différentes définitions d'une fonction inline sont les mêmes en C++ mais distinctes en C.
Exemple
Fichier d'en-tête "test.h"
#ifndef TEST_H_INCLUDED #define TEST_H_INCLUDED inline int sum(int a, int b) { return a + b; } #endif
Fichier source "sum.c"
#include "test.h" extern inline int sum(int a, int b); // fournit une définition externe
Fichier source "test1.c"
#include <stdio.h> #include "test.h" extern int f(void); int main(void) { printf("%d\n", sum(1, 2) + f()); }
Fichier source "test2.c"
#include "test.h" int f(void) { return sum(3, 4); }
` et contient des termes spécifiques au C++ qui doivent être préservés. Seul le texte environnant (s'il y en avait) aurait été traduit en français.
Sortie
10
Références
- Norme C23 (ISO/IEC 9899:2024) :
-
- 6.7.4 Spécificateurs de fonction (p: TBD)
- Norme C17 (ISO/CEI 9899:2018) :
-
- 6.7.4 Spécificateurs de fonction (p: TBD)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 6.7.4 Spécificateurs de fonction (p: 125-127)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 6.7.4 Spécificateurs de fonction (p: 112-113)
Voir aussi
|
Documentation C++
pour
inline
specifier
|