Question SpeakUp sur static

Question SpeakUp sur static

par Misha Timothey Abipour,
Number of replies: 1

Bonjour,

Pour la première question du SpeakUp, je ne comprends pas  pourquoi on a une erreur à l'édition de lien. En effet, dans la slide que vous affichez pour posez la question, on voit que l'on a suivit les instructions que vous nous avez donné dans le cours par rapport aux static dans un module c'est-à-dire:

-ne pas mettre en public

-la laisse visible dans l'interface du module


Donc où est le problème?

Merci d'avance

In reply to Misha Timothey Abipour

Re: Question SpeakUp sur static

par Ronan Boulic,

je cite :

on voit que l'on a suivit les instructions que vous nous avez donné dans le cours par rapport aux static dans un module c'est-à-dire:

-ne pas mettre en public

OK

-la laisse visible dans l'interface du module

incorrect: l'attribut est visible dans l'interface de la classe (ça c'est OK) ce qui est différent de l'interface du module (ça c'est la cause du problème).

relisez le deuxième slide: on indique de ne jamais mettre une déclaration/initialisation d'une variable static dans l'interface d'un module. C'est dans l'implémentation du module qu'il faut le faire

Dans le contexte du slide2, la video précise que les conséquences ne sont pas dramatiques: ça compile et produit un exécutable; le problème est seulement de créer des variables static partout où l'interface du module est incluse.

Dans le contexte d'un attribut de classe il ne faut pas non plus initialiser un attribut de classe dans l'interface d'un module. la conséquence est la détection d'une erreur par l'éditeur de liens (réponse B) car l'attribut de classe est défini/initialisé 2 fois:

1) quand on inclut rect.h dans rect.cc pour l'étape de compilation qui produit rect.o (cette étape de compilation elle-même ne détecte rien).

2) quand on inclut rect.h dans prog.cc pour l'étape de compilation qui produit prog.o (cette étape de compilation elle-même ne détecte rien).

La double définition n'est pas détectée à l'étape de la compilation parce qu'il s'agit de 2 compilations séparées complètement indépendantes qui ignorent ce qui est fait par l'autre compilation. En particulier, chaque compilation a réservé de l'espace mémoire pour l'attribut static. Vous pouvez compiler séparément et vous verrez qu'il n'y a pas d'erreur:

g++ -std=c++11 rect.cc -c

g++ -sdt=c++11 prog.cc -c

C'est l'étape d'édition de liens qui assemble rect.o et prog.o et qui détecte la double réservation d'espace mémoire pour l'attribut de classe: d'où l'erreur qui stoppe la production de l'exécutable

Conclusion, pour un attribut de classe aussi, c'est dans l'implémentation du module qu'il faut l'initialiser.