Par défaut, une ligne de définition n'est valable que dans le courant de l'unité de traduction.
Si la classe de stockage est - extern
, de l'identifiant liaison externe et la ligne de définition fournit également la définition externe.
Si la classe de stockage est - static
, de l'identifiant interne de l'articulation et de la ligne de définition est invisible dans d'autres unités de traduction.
Si la classe de stockage n'est pas spécifié, la ligne de définition n'est visible que dans le courant de l'unité de traduction, mais l'identificateur a encore de la liaison externe et une définition externe doivent être fournis dans une autre unité de traduction. Le compilateur est libre d'utiliser la ligne ou la définition externe si la fonction est appelée dans le courant de l'unité de traduction.
Comme le compilateur est libre de inline (et non inline) toute fonction dont la définition est visible dans le courant de l'unité de traduction (et, grâce à un lien en temps optimisations, même dans les différentes unités de traduction, bien que le C standard n'a pas vraiment compte), à toutes fins pratiques, il n'y a pas de différence entre static
et static inline
des définitions de fonction.
L' inline
spécificateur (comme l' register
classe de stockage) n'est qu'un compilateur d'indice, et le compilateur est libre d'ignorer complètement. Conforme aux normes de la non-optimisation des compilateurs seulement à honorer leurs effets secondaires, et l'optimisation des compilateurs de ces optimisations, avec ou sans l'accord des conseils.
inline
et register
ne sont pas inutiles, bien, comme ils demander au compilateur de générer des erreurs lorsque le programmeur écrit le code qui ferait de la optimisations impossible: externe - inline
définition ne peut pas référence à des identifiants avec une liaison interne (comme ces serait pas disponible dans une autre unité de traduction) ou de définir modifiables variables locales statiques durée de stockage (comme ceux-ci n'auraient pas partager l'état à travers les unités de traduction), et vous ne pouvez pas prendre les adresses de register
-qualifiés variables.
Personnellement, j'utilise la convention de mark static
des définitions de fonction dans les en-têtes aussi inline
, comme la principale raison pour mettre des définitions de fonctions dans les fichiers d'en-tête est de les faire inlinable.
En général, je n'utilise static inline
la fonction et de l' static const
définitions d'objet en plus d' extern
des déclarations dans les en-têtes.
Je n'ai jamais écrit un inline
fonction avec une classe de stockage différent de static
.