Je suppose que vous avez raté quelque chose, ici.
statique?
La déclaration d'une fonction statique de se faire "caché" dans son unité de compilation. Si vous déclarez des fonctions statiques dans un en-tête, alors toutes les unités de compilation, y compris cet en-tête ont leur propre copie de la fonction (et, éventuellement, des variables statiques à l'intérieur).
Cela signifie que si vous avez une fonction statique (ou même un objet global/variable), alors cette fonction existe dans chaque unité de compilation (c'est à dire un fichier CPP) qui inclut l'en-tête où cette fonction statique est déclarée. Je n'ai pas encore de voir des cas (mais quelques rares debug coin des cas) où c'est quelque chose que vous voulez.
inline?
Déclarant inline en fait un candidat pour inline (il ne signifie pas grand-chose de nos jours en C++, le compilateur en ligne ou pas, parfois, en ignorant le fait que le mot-clé inline est présent ou absent).
Dans un en-tête, elle a un effet secondaire: La fonction inline peut être défini plusieurs fois dans le même module, et l'éditeur de liens il vous suffit de rejoindre le "eux" en un seul (si elles n'ont pas été intégrées pour le compilateur de la raison).
Ceci a l'avantage de "statique" (c'est à dire qu'il peut être défini dans un en-tête) sans ses défauts (il existe au plus une fois, si il n'est pas incorporé)
statique + inline?
Mixage en ligne et statique aura alors les conséquences que vous avez décrit (même si la fonction est insérée, la variable statique à l'intérieur ne sera pas, et vous vous retrouverez avec autant de variables statiques comme vous l'avez unités de compilation, y compris la définition de vos fonctions statiques).
De toute façon, quel est le point de déclarer votre fonction statique en C++?
Parce qu'il devrait être privé? Si si, ne pas la déclarer dans un en-tête (seulement dans un RPC), ou mieux encore, utiliser C++idiome pour que (la définir à l'intérieur d'un anonyme, un espace de noms à l'intérieur du fichier CPP).
(Notez que je parle de fonctions, pas de méthodes: les méthodes statiques ont leurs usages en C++)
Réponse de l'auteur, la question de savoir
Depuis que j'ai écrit la question que je l'ai essayé avec Visual Studio 2008. J'ai essayé d'activer toutes les options qui font de VS agir en conformité avec les normes, mais il est possible que j'ai raté quelques. Ce sont les résultats:
Lorsque la fonction est simplement "inline", il n'y a qu'une seule copie de la variable statique.
Lorsque la fonction est "static inline", il y a autant d'exemplaires qu'il y a des unités de traduction.
La vraie question est maintenant de savoir si les choses sont censé être de cette façon, ou si c'est une idiosyncrasie de le compilateur C++ de Microsoft.
Donc je suppose que vous avez quelque chose comme ça:
void doSomething()
{
static int value ;
}
Vous devez réaliser que la variable statique à l'intérieur de la fonction, il suffit de mettre, une variable globale caché de tous, mais la fonction de la portée, ce qui signifie que seule la fonction à laquelle elle est déclarée à l'intérieur peut atteindre.
Inlining la fonction ne change rien:
inline void doSomething()
{
static int value ;
}
Il n'y aura qu'une variable globale masquée. Le fait que le compilateur va essayer d'insérer le code ne change pas le fait il n'existe qu'une seule variable cachée.
Maintenant, si votre fonction est déclarée statique:
static void doSomething()
{
static int value ;
}
Ensuite, il est "privé" pour chaque unité de compilation, ce qui signifie que chaque fichier CPP, y compris l'en-tête où la fonction statique est déclaré aura sa propre copie privée de la fonction, y compris sa propre copie privée de global variable cachée, donc autant de variables qu'il y a des unités de compilation, y compris l'en-tête.
L'ajout de "en ligne" à "statique" de la fonction avec un "statique" de la variable à l'intérieur:
inline static void doSomething()
{
static int value ;
}
a le même résultat que de ne pas l'ajout de cette mot clé "inline", autant que la variable statique à l'intérieur est concerné.
Ainsi, le comportement de VC++ est correcte, et que vous êtes se méprendre sur le sens réel de "inline" et "statique".