12
votes

Pourquoi devrais-je ne pas initialiser la variable statique en tête d'en-tête?

Alors, disons que j'ai une en-tête comme ceci:

int BaseClass::x = 10; 


1 commentaires

La question de la question et des réponses ici sont supérieures à celles de la question désignée!


4 Réponses :


12
votes

Si vous le faites dans l'en-tête, vous obtiendrez plusieurs erreurs de définition dès que vous l'inclurez à partir de plusieurs fichiers de CPP. Vous racontez vraiment au compilateur deux choses lorsque vous déclarez

int BaseClass::x = 10;


2 commentaires

Je pense que je commence à avoir l'idée, mais y a-t-il un moyen de le démontrer? Est-ce que je dois écrire deux programmes différents, qui incluent la base de base et les courent simultanéosly?


@ user3496846 Non, vous devez simplement avoir un seul programme composé de (au moins) deux fichiers CPP, qui incluent tous les deux votre en-tête.



2
votes

Parce que si vous l'initialisez dans l'en-tête, il est possible que cela soit défini dans plusieurs endroits si vous incluez l'en-tête plus d'une fois. Qui entraînera une erreur de liaison


0 commentaires

4
votes

Les gardes n'empêchent pas plusieurs copies dans plusieurs fichiers source. Ils n'empiètent que plusieurs copies dans un fichier source.

Vous violerez la règle d'une définition si vous avez plusieurs fichiers source que #include "base_class.h" .


0 commentaires

5
votes

Peut-être qu'il est plus facile de comprendre si vous pensez à ce que le préprocesseur fait réellement: il copie le contenu de tous les fichiers d'en-tête inclus dans le fichier CPP et le transmet au compilateur.

Disons que vous avez: P >

int aGlobalVariable = 10;


3 commentaires

Mais à part le #include "basoclass.h", le lien de lieur ne comprendra pas la double définition de la classe elle-même, qui devrait également causer un problème? Désolé, cela peut prendre du temps pour que je comprenne ...


Non, parce que c'est juste une classe Déclaration . J'ajouterai un peu à ma réponse à ma réponse


Ok, merci beaucoup pour une réponse aussi descriptive, je pense que je commence à avoir l'idée :)