28 votes

Quel est le but de __cxa_pure_virtual?

Alors que la compilation avec avr-gcc, j'ai rencontré l'éditeur de liens erreurs telles que les suivantes:

undefined reference to `__cxa_pure_virtual'

J'ai trouvé ce document qui stipule:

L' __cxa_pure_virtual fonction est un gestionnaire d'erreur, qui est appelée lorsqu'une fonction virtuelle pure est appelée.

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

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

La définition de cette fonction, comme l'a suggéré corrige les erreurs, mais j'aimerais savoir:

  • quel est le but de cette fonction est,
  • pourquoi j'ai besoin de le définir moi-même et
  • pourquoi il est acceptable de code comme une boucle infinie?

20voto

xtofl Points 22333

Si n'importe où dans l'exécution de votre programme de création d'un objet avec une fonction virtuelle pointeur n'est pas remplie, et lorsque la fonction correspondante est appelée, ce que vous appelez une "fonction virtuelle pure'.

Le gestionnaire vous décrire devraient être définies dans les bibliothèques par défaut qui viennent avec votre environnement de développement. S'il vous arrive d'omettre les bibliothèques par défaut, vous trouverez ce gestionnaire indéfini: l'éditeur de liens voit une déclaration, mais pas de définition. C'est quand vous avez besoin de fournir votre propre version.

La boucle infinie est acceptable parce que c'est un "loud" erreur: l'utilisateur de votre logiciel sera immédiatement remarquer. Toute autre "loud" de la mise en œuvre est acceptable, trop.

6voto

Mark Seaborn Points 434

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

Des fonctions virtuelles pures peut être appelé au cours de l'objet de la construction/destruction. Si cela se produit, __cxa_pures_virtuelle() est appelée pour signaler l'erreur. Voir Où faire "appel de fonction virtuelle pure" plantages viennent?

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

Normalement, cette fonction est fournie par libstdc++ (par exemple, sur Linux), mais de avr-gcc et l'Arduino chaîne d'outils n'offrent pas de libstdc++.

L'IDE Arduino parvient à éviter l'éditeur de liens d'erreur lors de la construction de certains programmes, car il compile avec les options "-ffunction-sections -fdata-sections" et des liens avec des "-Wl,--gc-sections", ce qui tombe quelques références de la partie inutilisée des symboles.

3) Pourquoi est-il acceptable de code __cxa_pures_virtuelle() comme une boucle infinie?

Eh bien, c'est au moins sûr; il fait quelque chose de prévisible. Il serait plus utile pour annuler le programme et de rendre compte de l'erreur. Une boucle infinie serait difficile à déboguer, sauf si vous avez un débogueur qui peut interrompre l'exécution et de donner un stack trace.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X