Quel est l'effet static const sur un espace de noms membre
//MyClass.h
namespace MyNamespace {
static const double GasConstant = 1.987;
class MyClass
{
//constructors, methods, etc.
};
}
J'ai déjà eu GasConstant déclaré dans la MyClass déclaration (et avait une définition distincte dans le fichier source depuis C++ ne prend pas en charge const
initialisation de la non-types intégraux). J'ai cependant besoin d'accéder à partir d'autres fichiers et aussi logiquement, il me semble qu'il devrait se trouver au niveau espace de noms.
Mes questions, quel est l'effet static const
avoir dans ce cas? Clairement const
signifie que je ne peut pas affecter une nouvelle valeur à GasConstant, mais que fait un membre statique à l'espace de noms moyenne. Est-ce similaire à la statique à la portée de fichier, lorsque le membre n'est pas accessible de l'extérieur de l'unité?
- Est-ce dans un fichier d'entête (.h) ou dans un fichier d'implémentation (.rpc) ???
- C'est dans un fichier d'entête (.h).
- En C++ il n'existe pas de fichier portée. Il y a seulement de l'espace de noms d'étendues en C++ si vous êtes à l'extérieur de fonctions et de classes. Aussi, si vous continuez de lire quelques pages de ce qu'ils appellent "global", ils signifient généralement l'espace de noms global et d'autres espaces de noms inclus.
cplusplus.com
est connu pour ses inexact d'utiliser le mot "global", par exemple. Donc, si quelque chose qui explique les effets de "statiques", "de portée mondiale", ils signifient généralement son effet dans l'espace de noms de la portée.
Vous devez vous connecter pour publier un commentaire.
L'utilisation de
static
à portée espace de nomsesta* obsolète en C++. Il ne devrait normalement jamais être vu dans un fichier source, où elle a pour effet de rendre la variable locale de ce fichier source. C'est, d'un autre fichier source peut avoir une variable de même nom avec pas de conflit.En C++, il est recommandé d'effectuer les variables locales à la source du fichier est d'utiliser un espace de noms anonymes.
Je pense qu'il est juste de dire que le
static
dans l'en-tête dans votre code est tout simplement incorrect.*Comme l'a souligné Tom dans les commentaires (et dans ce réponse), le comité C++ a renversé la décision de déprécier
static
utilisation à la portée de fichier, sur la base que cette utilisation sera toujours une partie de la langue (par exemple, pour C de compatibilité).MSDN dit:
Rappelez-vous que l'inclusion des fichiers d'en-tête signifie remplacer le "#include"-directive avec le code réel de l'en-tête de fichier. Ainsi, les variables statiques ne sera visible que dans l' ".rpc" (qui est compilé) fichier qui contient les deux fichiers d'en-tête.
De sorte que chaque "rpc"-fichier y compris les en-têtes de variable statique.
Si c'est un fichier d'en-tête, puis
static
n'a aucun effet dans ce cas.const
objets ont déjà liaison interne par défaut en C++, donc si vous la déclarez avecstatic
ou sansstatic
ne fait aucune différence que ce soit.Je suppose que vous simplement déplacé la déclaration de la classe dans l'espace de noms. Mais
static
a tout autre sens dans le contexte de la déclaration de la classe et dans le contexte de l'espace de noms. À l'intérieur de la classe, vous en aviez besoinstatic
. Dans l'espace de noms de lastatic
est superflu.static
dans la classe. Avec elle et sans elle, les deux ne sont pas valides pourdouble
🙂Template<GasConstant>
sera une ODR violation si elle est instancié dans deux unités de traduction.