6.7.4 Fonction des prescripteurs
Une nouvelle fonctionnalité de C99: L' inline
mot-clé, adapté à partir de C++, une fonction spécificateurque
peut être utilisé seulement dans les déclarations de fonction. Il est utile pour le programme d'optimisations qui nécessitent l'
définition d'une fonction pour être visible sur le site de l'appel. (À noter que la Norme n'est pas de tenter de préciser la nature de ces optimisations.)
La visibilité est assurée que si la fonction a une liaison interne, ou si elle a une liaison externe et l'appel
est dans la même unité de traduction comme la définition externe. Dans ces cas, la présence de l'
inline
mot-clé dans une déclaration ou de la définition de la fonction n'a aucun effet au-delà indiquant un
la préférence que les appels de cette fonction doit être optimisé, de préférence à des appels à d'autres fonctions déclarées sans le inline
mot-clé.
La visibilité est un problème pour un appel d'une fonction de liaison externe où l'appel est dans un
différent de l'unité de traduction à partir de la définition de la fonction. Dans ce cas, l' inline
mot-clé
permet à l'unité de traduction contenant l'appel à également contenir un local, ou en ligne, la définition de l'
fonction.
Un programme peut contenir une unité de traduction avec une définition externe, une unité de traduction avec un
inline définition, et une unité de traduction avec une déclaration, mais pas de définition d'une fonction. Appels
dans la dernière unité de traduction utilisera la définition externe, comme d'habitude.
Une ligne de définition d'une fonction est considérée comme une définition que l'extérieur
définition. Si un appel à une fonction func
avec une liaison externe se produit lorsqu'un inline
la définition est visible, le comportement est le même que si l'appel ont été faites à une autre fonction, dire
__func
, avec une liaison interne. Conforme au programme ne doivent pas dépendre de la fonction
appelé. C'est la ligne dans le modèle Standard.
Conforme au programme ne doivent pas compter sur la mise en œuvre à l'aide de la ligne de définition, ni
il s'appuyer sur la mise en œuvre à l'aide de la définition externe. L'adresse d'une fonction est toujours l'adresse correspondant à la définition externe, mais lorsque cette adresse est utilisée pour appeler le
la fonction, la ligne de définition peut être utilisé. Ainsi, l'exemple suivant peut pas
se comporter comme prévu.
inline const char *saddr(void)
{
static const char name[] = "saddr";
return name;
}
int compare_name(void)
{
return saddr() == saddr(); // unspecified behavior
}
Depuis la mise en œuvre pourrait utiliser la ligne de définition pour l'un des appels à l' saddr
et l'utilisation
la définition externe pour les autres, l'égalité n'est pas garanti à évaluer à 1
(vrai). Cela montre que les objets statiques définies au sein de la ligne de définition sont distinctes de leurs
objet correspondant à la définition externe. Ceci a motivé la contrainte à l'encontre même de
la définition d'un non-const
objet de ce type.
Inline a été ajouté à la Norme de telle manière qu'il puisse être mis en œuvre avec l'existant de l'éditeur de liens
la technologie, et un sous-ensemble de C99 inline est compatible avec le C++. Ceci a été réalisé en exigeant que exactement une unité de traduction contenant la définition d'une fonction inline être
spécifié comme celui qui fournit la définition externe de la fonction. Parce que
la spécification se compose simplement d'une déclaration qui soit dépourvu de l' inline
mot-clé, ou contient
les deux inline
et extern
, il sera également acceptée par un C++ traducteur.
Inline en C99 ne s'étendent le C++ spécification de deux façons. Tout d'abord, si une fonction est déclarée
inline
dans une unité de traduction, il n'a pas besoin d'être déclarée inline
dans tous les autres de l'unité de traduction.
Cela permet, par exemple, une fonction de la bibliothèque qui est à être incorporé au sein de la bibliothèque mais disponible
seule une définition externe ailleurs. L'alternative de l'utilisation d'une fonction wrapper pour
la fonction externe requiert un autre nom; et il peut également avoir un impact sur les performances
si un traducteur n'a pas réellement faire inline substitution.
Ensuite, l'exigence que toutes les définitions d'une fonction inline être "exactement les mêmes" est
remplacé par l'exigence que le comportement du programme ne doivent pas dépendre de l'existence d'un
l'appel est mis en œuvre avec une visible inline définition ou de la définition extérieure, d'une fonction.
Cela permet à une ligne de définition d'être un spécialiste pour son utilisation dans une unité de traduction.
Par exemple, la définition externe d'une fonction de bibliothèque peuvent inclure un argument de validation n'est pas nécessaire pour les appels effectués à partir d'autres fonctions dans la même bibliothèque. Ces
les extensions offrent quelques avantages; et les programmeurs qui sont préoccupés au sujet de la compatibilité
pouvez simplement respecter la plus stricte C++ règles.
Notez qu'il n'est pas approprié pour les implémentations de fournir inline définitions de la norme
les fonctions de la bibliothèque dans la norme en-têtes de parce que cela peut casser un code existant redeclares standard des fonctions de la bibliothèque à la suite notamment de leurs en-têtes. L' inline
mot-clé est
elle vise uniquement à fournir aux utilisateurs avec un portable moyen de suggérer un alignement de fonctions. Parce que le
des en-têtes standard n'a pas besoin d'être portable, implémentations ont d'autres options, le long des lignes de:
#define abs(x) __builtin_abs(x)
ou d'autres non-portable mécanismes pour inline standard des fonctions de la bibliothèque.