En C ++ spécifiquement, quelles sont les différences sémantiques entre par exemple:
static const int x = 0 ;
et
const int x = 0 ;
à la fois static
en tant que lien et spécificateur de classe de stockage (c'est-à-dire à l'intérieur et à l'extérieur d'une fonction).
static
est probablement le mot clé le plus surchargé en C ++. La signification de votre code varie considérablement selon qu'il s'agit de la portée de l'espace de noms, de la portée de la classe ou de la portée de la fonction. Vous voudrez peut-être clarifier cela.::
sans identifiant devant). Je ne suis pas au courant de différences significatives entre l'espace de noms global et les espaces de noms qui y sont imbriqués. Il n'y a certainement aucunstatic
objet concernant .Réponses:
Au niveau du fichier, aucune différence en C ++.
const
fait de la liaison interne la valeur par défaut et toutes les variables globales ont une durée de vie statique. Mais la première variante a le même comportement en C, ce qui peut être une bonne raison de l'utiliser.Dans une fonction, la deuxième version peut être calculée à partir de paramètres. En C ou C ++, il n'est pas nécessaire que ce soit une constante de compilation comme l'exigent certains autres langages.
Au sein d'une classe, fondamentalement la même chose que pour les fonctions. Une
const
valeur d' instance peut être calculée dans la liste ctor-initializer . Astatic const
est défini lors de l'initialisation du démarrage et reste inchangé pour le reste du programme. (Remarque: le code desstatic
membres est un peu différent car la déclaration et l'initialisation sont séparées.)Rappelez-vous, en C ++,
const
signifie lecture seule , pas constante . Si vous avez un pointeur vers, d'const
autres parties du programme peuvent changer la valeur pendant que vous ne cherchez pas. Si la variable a été définie avecconst
, personne ne peut la modifier après l'initialisation, mais l'initialisation peut toujours être arbitrairement complexe.la source
const
s'applique à une vue de la variable et non à la variable elle-même, quelqu'un d'autre peut avoir une non-const
vue de la même variable, et le compilateur sera assez silencieux lorsqu'il la modifiera.const
, mais le nouveauconstexpr
peut être utilisé à la place (et dans d'autres scénarios également). En fait, la norme C ++ 0x étend également la possibilité d'utiliserconst
dans ce scénario à des "types littéraux" non intégraux. Je pense que je préférerais utiliserconstexpr
pour ces cas, car vous rompriez de toute façon la compatibilité descendante avec les compilateurs pré-C ++ 0x.Projet de norme C ++ 17 sur
const
impliquestatic
à la portée du fichierVoici la citation de ce qui a été mentionné sur: https://stackoverflow.com/a/3709257/895245
C ++ 17 n4659 standard draft 6.5 "Programme et liaison":
Annexe C (informative) Compatibilité, C.1.2 Clause 6: "concepts de base" explique pourquoi cela a été remplacé par C:
Voir aussi: Pourquoi const implique-t-il une liaison interne en C ++, alors que ce n'est pas le cas en C?
Ce que vous voulez probablement faire à la place sur les en-têtes
Expliqué en détail sur: Que signifie «const static» en C et C ++?
extern
dans l'en-tête, définition dans le fichier cppla source