¿Cuál es el propósito de __cxa_pure_virtual?
-
06-09-2019 - |
Pregunta
Mientras compilar con avr-gcc he encontrado errores de enlace tales como los siguientes:
undefined reference to `__cxa_pure_virtual'
He encontrado este documento que establece :
La función
__cxa_pure_virtual
es un controlador de errores que se invoca cuando una función virtual pura se llama.Si usted está escribiendo una aplicación de C ++ que tiene funciones virtuales puras debe proporcionar su propia función de gestor de errores
__cxa_pure_virtual
. Por ejemplo:
extern "C" void __cxa_pure_virtual() { while (1); }
La definición de esta función como soluciones sugeridas los errores pero me gustaría saber:
- cuál es el propósito de esta función es,
- ¿Por qué debería necesitar definir yo mismo y
- por eso que es aceptable para codificar como un bucle infinito?
Solución
Si cualquier parte del tiempo de ejecución de su programa se crea un objeto con un puntero de función virtual no rellenado, y cuando la función correspondiente se llama, se le llama una 'función virtual pura'.
El manejador describes debe definirse en las bibliotecas predeterminadas que vienen con su entorno de desarrollo. Si le sucede a omitir las bibliotecas predeterminadas, encontrará este controlador indefinido: el enlazador ve una declaración, pero no hay una definición. Que es cuando se necesita proporcionar su propia versión.
El bucle infinito es aceptable porque es un error 'fuerte': los usuarios de su software de inmediato se notará. Cualquier otra aplicación 'ruidosa' es aceptable, también.
Otros consejos
1) ¿Cuál es el propósito de la __cxa_pure_virtual función ()?
funciones virtuales puras pueden ser llamado durante la construcción objeto / destrucción. Si eso sucede, __cxa_pure_virtual () es llamado para informar del error. Ver hacer donde "llamada de función virtual pura" accidentes provienen de / a>
2) ¿Por qué puede necesitar definir usted mismo?
Normalmente esta función es proporcionada por libstdc ++ (por ejemplo en Linux), pero avr-gcc y la cadena de herramientas Arduino no proporcionan una libstdc ++.
La IDE de Arduino logra evitar el error de vinculador en la construcción de algunos programas, ya que compila con las opciones "-ffunction secciones -fdata secciones" y vínculos con "-Wl, - GC-secciones", que cae algunas referencias a los símbolos no utilizados.
3) ¿Por qué es aceptable para codificar __cxa_pure_virtual () como un bucle infinito?
Bueno, esto es, al menos, seguro; hace algo predecible. Sería más útil para abortar el programa y reportar el error. Un bucle infinito sería difícil de depurar, sin embargo, a menos que tenga un depurador que puede interrumpir la ejecución y dar una traza de pila.