Was ist der Zweck von __cxa_pure_virtual?
Während der Kompilierung mit avr-gcc habe ich festgestellt linker-Fehler wie der folgende:
undefined reference to `__cxa_pure_virtual'
Habe ich gefunden dieses Dokument, die besagt:
Den
__cxa_pure_virtual
Funktion einen error-handler, der aufgerufen wird, wenn eine rein virtuelle Funktion aufgerufen wird.Wenn Sie das schreiben eines C++ - Anwendung, die hat rein virtuelle Funktionen müssen Sie liefern Ihre eigene
__cxa_pure_virtual
error-handler-Funktion. Zum Beispiel:
extern "C" void __cxa_pure_virtual() { while (1); }
Definition dieser Funktion, wie vorgeschlagen, behebt die Fehler, aber ich würde gerne wissen:
- was der Zweck dieser Funktion ist,
- warum sollte ich brauchen, um zu definieren, es selbst und
- warum es akzeptabel ist, dass es code als Endlosschleife?
Möglicherweise erhalten Sie diese Fehlermeldung, wenn mit den
gcc
Befehl, wo Sie verwenden sollten g++
; ich habe es getan mindestens einmal 🙂InformationsquelleAutor Matthew Murdoch | 2009-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn irgendwo in der Laufzeit des Programms ein Objekt erstellt wird mit einem virtuellen Funktionszeiger nicht ausgefüllt, und wenn die entsprechende Funktion aufgerufen wird, wird Sie aufgerufen werden eine "rein virtuelle Funktion".
Den handler, den Sie beschreiben, sollte festgelegt werden, in den Standard-libraries, die kommen mit Ihrer Entwicklungsumgebung. Wenn Sie geschehen, um das auslassen der Standard-Bibliotheken, finden Sie diese handler nicht definiert: der linker sieht eine Deklaration, aber keine definition. Das ist, wenn Sie brauchen, um Ihre eigene version anzugeben.
Die Endlosschleife ist akzeptabel, weil es ist ein 'lauter' Fehler: Benutzer der software werden Sie sofort bemerken. Jede andere 'laute' Umsetzung ist akzeptabel, auch.
🙂 ein Blick in die 'Verwandte', die Fragen auf der rechten Seite.
Vielen Dank, stackoverflow.com/questions/99552/... war besonders hilfreich.
InformationsquelleAutor xtofl
1) Was ist der Zweck der Funktion __cxa_pure_virtual()?
Rein virtuelle Funktionen können aufgerufen werden, während der Objekt-Konstruktion/Zerstörung. Wenn das passiert, __cxa_pure_virtual() wird aufgerufen, um den Fehler zu melden. Sehen Wo fangen die "pure virtual function call" Abstürze kommen?
2) Warum müssen Sie ihn selbst festlegen?
Normalerweise diese Funktion wird zur Verfügung gestellt von libstdc++ (z.B. auf Linux), aber avr-gcc und Arduino-toolchain nicht libstdc++.
Die Arduino-IDE verwaltet, um zu vermeiden, die linker-Fehler beim erstellen einige Programme, weil es kompiliert wird, mit den Optionen "-ffunction-sections -fdata-sections" und links mit "-Wl,--gc-sections", die Tropfen einige Verweise auf verwendete Symbole.
3) Warum ist es akzeptabel, code __cxa_pure_virtual() eine Endlosschleife?
Gut, das ist zumindest sicher; es hat etwas vorhersehbar. Es wäre nützlicher, zum Abbruch des Programms und den Fehler melden. Eine Endlosschleife wäre umständlich zu Debuggen, obwohl, es sei denn, Sie haben ein debugger, can-interrupt-Ausführung und geben einen Stapel backtrace.
InformationsquelleAutor Mark Seaborn