2009-05-28 5 views
39

Alors que la compilation avec avr-gcc J'ai rencontré des erreurs de liaison tels que les suivants:Quel est l'objectif de __cxa_pure_virtual?

undefined reference to `__cxa_pure_virtual' 

J'ai trouvé this document qui stipule:

The __cxa_pure_virtual function is an error handler that is invoked when a pure virtual function is called.

If you are writing a C++ application that has pure virtual functions you must supply your own __cxa_pure_virtual error handler function. For example:

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

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

  • quel est le but de cette fonction est,
  • pourquoi je devrais avoir besoin de le définir moi-même et
  • pourquoi il est acceptable de le coder comme une boucle infinie?
+2

Vous pouvez obtenir cette erreur lorsque vous utilisez la commande 'gcc' où vous devriez utiliser' g ++'; Je l'ai fait au moins une fois :) – user2023370

Répondre

32

Si, à l'exécution de votre programme, un objet est créé avec un pointeur de fonction virtuelle non renseigné, et lorsque la fonction correspondante est appelée, vous appelez une 'fonction virtuelle pure'.

Le gestionnaire que vous décrivez doit être défini dans les bibliothèques par défaut fournies avec votre environnement de développement. Si vous omettez 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 à ce moment que vous devez fournir votre propre version.

La boucle infinie est acceptable car il s'agit d'une erreur «forte»: les utilisateurs de votre logiciel le remarquent immédiatement. Toute autre implémentation «forte» est également acceptable.

+0

Qu'est-ce qui pourrait empêcher le remplissage du pointeur de fonction virtuelle? Le compilateur ne détecterait-il pas cela et empêcherait la compilation? –

+2

:) jetez un oeil dans les questions «connexes» sur la droite. – xtofl

+0

@xtofl Merci, http://stackoverflow.com/questions/99552/where-do-pure-virtual-function-call-crashes-come-from a été particulièrement utile. –

15

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

Des fonctions virtuelles pures peuvent être appelées pendant la construction/destruction d'objet. Si cela se produit, __cxa_pure_virtual() est appelé pour signaler l'erreur. Voir Where do "pure virtual function call" crashes come from?

2) Pourquoi pourriez-vous le définir vous-même?

Normalement, cette fonction est fournie par libstdC++ (par exemple sur Linux), mais avr-gcc et la chaîne d'outils Arduino ne fournissent pas de libstdC++. L'EDI Arduino parvient à éviter l'erreur de l'éditeur de liens lors de la construction de certains programmes car il compile avec les options "-function-sections -fdata-sections" et des liens avec "-Wl, - gc-sections", ce qui fait chuter références aux symboles inutilisés.

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

Eh bien, c'est au moins sûr; ça fait quelque chose de prévisible. Il serait plus utile d'annuler le programme et de signaler l'erreur. Une boucle infinie serait toutefois délicate à déboguer, à moins que vous n'ayez un débogueur capable d'interrompre l'exécution et de donner un backtrace de pile.