Différence entre une fonction en ligne et une fonction en ligne statique

quelqu'un peut-il me dire quelle est la différence entre une fonction inline et une fonction inline statique?

dans quels cas devrais-je préférer la ligne statique à la ligne?

je pose cette question parce que j'ai une fonction inline pour laquelle je suis confronté à des problèmes de compilation lors de la mise en lien (relocation error:... symbol has been discarded with discarded section ...). J'en ai fait une fonction normale et ça a marché. Maintenant, certains de mes aînés m'a dit d'essayer avec statique sur la ligne. Voici ma fonction:

inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1)
{
   wizuiNotifier* notifier = ::wizNtrKit.getNotifier (nn_name);
   notifier->notify (arg, aspect);
}

et ce n'est pas à l'intérieur d'un classe. C'est à l'intérieur d'un fichier d'en-tête!

je suppose que l'appel à une fonction statique devrait être fait seulement dans le TU particulier où il est défini.

puisque ma fonction est dans un fichier d'en-tête et si je la rends statique, est-ce que ce sera le cas, où que j'inclue ce fichier d'en-tête, la fonction statique peut être utilisée dans cette unité de traduction?

24
demandé sur BrechtDeMan 2012-10-11 13:15:14

1 réponses

Le non-statique inline déclaration de fonction se réfère à la même fonction, dans chaque unité de traduction (fichier source) qui l'utilise.

la règle de la définition unique exige que le corps de la définition de la fonction soit identique dans chaque TU qui la Contient, avec une définition longue de "identique". Ceci est généralement satisfait à condition que les fichiers source utilisent tous le même en-tête, et à condition que la fonction n'utilise aucun nom global avec un lien interne (y compris static fonctions) ou toute macros qui sont définies différemment dans différents TUs.

Je ne me souviens pas avoir rencontré cette erreur de linker avant, mais il est au moins possible que l'une de ces restrictions soit responsable. Il est de votre responsabilité de satisfaire les exigences: comportement non défini avec aucun diagnostic requis si vous ne le faites pas.

static inline déclaration de fonction se réfère à une fonction différente dans chaque unité de traduction, qui se trouve justement avoir la même nom. Il peut utiliser static noms globaux ou macros qui sont différents dans différents TUs, auquel cas la fonction pourrait se comporter différemment dans les différents TUs, même si sa définition dans le fichier d'en-tête "ressemble au même".

en Raison de cette différence, si la fonction contient des static variables locales puis il se comporte différemment selon qu'il est static ou pas. Si c'est static alors chaque TU a sa propre version de la fonction et donc sa propre copie de la static variables locales. Si c'est inline seulement, alors il existe une seule copie de l' static variables locales utilisées par tous les ut.

38
répondu Steve Jessop 2012-10-11 09:41:41