Réponses:
Vous faites essentiellement référence à la section §7.3.1.1 / 2 du Standard C ++ 03,
L'utilisation du mot clé static est déconseillée lors de la déclaration d'objets dans une étendue d'espace de noms; l'espace de noms sans nom fournit une alternative supérieure.
Notez que ce paragraphe a déjà été supprimé dans C ++ 11. static
les fonctions standard ne sont plus obsolètes!
Néanmoins, les espaces de noms sans nom sont supérieurs au mot-clé static, principalement parce que le mot-clé static
s'applique uniquement aux déclarations et fonctions de variables , et non aux types définis par l'utilisateur .
Le code suivant est valide en C ++
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
Mais ce code n'est PAS valide:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
Donc, la solution est, un espace de noms sans nom, qui est ceci,
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
J'espère qu'il explique que pourquoi unnamed-namespace
est supérieur à static
.
Notez également que l'utilisation du mot-clé static est déconseillée lors de la déclaration d'objets dans une étendue d'espace de noms (selon la norme).
deprecated
remarque ait été supprimée du dernier C ++ 0x FCD (n3225).
.cpp
définissent une classe avec le même nom.
Il y a un problème intéressant lié à ceci:
Supposons que vous utilisiez des static
mots clés ou sans nom namespace
pour rendre une fonction interne au module (unité de traduction), puisque cette fonction est destinée à être utilisée en interne par le module et non accessible en dehors de celui-ci. (Les namespace
s sans nom ont l'avantage de rendre les définitions de données et de types internes, en plus des fonctions).
Avec le temps, le fichier source de l'implémentation de votre module devient volumineux et vous souhaitez le diviser en plusieurs fichiers source séparés, ce qui permettrait de mieux organiser le code, de trouver les définitions plus rapidement et d'être compilé indépendamment.
Mais maintenant vous êtes confronté à un problème: ces fonctions ne peuvent plus appartenir static
au module, car elles static
ne font pas réellement référence au module , mais au fichier source (unité de traduction). Vous êtes obligé de les rendre non - static
pour leur permettre d'accéder à partir d'autres parties (fichiers objets) de ce module. Mais cela signifie aussi qu'ils ne sont plus cachés / privés du module: ayant un lien externe, ils sont accessibles depuis d'autres modules, ce qui n'était pas votre intention initiale.
Unnamed namespace
ne résoudrait pas non plus ce problème, car il est également défini pour un fichier source particulier (unité de traduction) et n'est pas accessible de l'extérieur.
Ce serait formidable si l'on pouvait spécifier que certains namespace
sont private
, c'est-à-dire que tout ce qui y est défini, est destiné à être utilisé en interne par le module auquel il appartient. Mais bien sûr, C ++ n'a pas de concept de "modules", seulement des "unités de traduction", qui sont étroitement liées aux fichiers source.
Le standard C ++ lit dans la section 7.3.1.1 Espaces de noms sans nom, paragraphe 2:
L'utilisation du mot-clé static est déconseillée lors de la déclaration d'objets dans une étendue d'espace de noms, l'espace de noms sans nom fournit une alternative supérieure.
La statique s'applique uniquement aux noms d'objets, de fonctions et d'unions anonymes, pas aux déclarations de type.
static
fonctionnent que.