Question

Alors que la compilation avec gcc-je AVR ai rencontré des erreurs de l'éditeur de liens tels que:

undefined reference to `__cxa_pure_virtual'

Je l'ai trouvé ce document qui stipule :

  

La fonction __cxa_pure_virtual est un gestionnaire d'erreur qui est invoquée lorsque une fonction virtuelle pure est appelée.

     

Si vous écrivez une application C ++ qui a des fonctions virtuelles pures, vous devez fournir votre propre fonction de gestionnaire d'erreurs __cxa_pure_virtual. Par exemple:

     

extern "C" void __cxa_pure_virtual() { while (1); }

Définir cette fonction que des corrections suggérées les erreurs, mais je voudrais savoir:

  • quel est le but de cette fonction est,
  • pourquoi je besoin de définir moi-même et
  • pourquoi il est acceptable de ce code comme une boucle infinie?
Était-ce utile?

La solution

Si partout dans le moteur d'exécution de votre programme un objet est créé avec un pointeur de fonction virtuelle FOURRES, et quand la fonction correspondante est appelée, vous appeler une «fonction virtuelle pure.

Le gestionnaire que vous décrivez doit être défini dans les bibliothèques par défaut qui viennent avec votre environnement de développement. Si vous arrive d'omettre les bibliothèques par défaut, vous trouverez ce gestionnaire non défini: l'éditeur de liens voit une déclaration, mais pas de définition. C'est quand vous devez fournir votre propre version.

La boucle infinie est acceptable parce qu'il est une erreur « forte »: les utilisateurs de votre logiciel immédiatement remarquer. Toute autre mise en œuvre « fort » est trop acceptable.

Autres conseils

1) Quel est le but de la fonction __cxa_pure_virtual ()?

fonctions virtuelles pures peuvent obtenir appelé lors de la construction / destruction d'objets. Si cela se produit, __cxa_pure_virtual () est appelée à signaler l'erreur. Voir Où faire plantages « pur appel de fonction virtuelle » viennent?

2) Pourquoi auriez-vous besoin de définir vous-même?

Normalement, cette fonction est assurée par libstdc ++ (par exemple sous Linux), mais gcc-et AVR l'ensemble des outils Arduino ne fournissent pas libstdc ++.

L'Arduino IDE parvient à éviter l'erreur de liaison lors de la construction des programmes, car il compile avec les options « sections -ffunction--fdata sections » et des liens avec « -Wl, - sections gc- », qui gouttes quelques références symboles inutilisés.

3) Pourquoi est-il acceptable de coder __cxa_pure_virtual () comme une boucle infinie?

Eh bien, cela est au moins sûr; il fait quelque chose de prévisible. Il serait plus utile d'abandonner le programme et signaler l'erreur. Une boucle infinie serait difficile à déboguer, bien que, sauf si vous avez un débogueur qui peut interrompre l'exécution et donner une trace de la pile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top