2009-05-28 13 views
39

Mientras que compilar con avr-gcc he encontrado errores de enlace tales como los siguientes:¿Cuál es el propósito de __cxa_pure_virtual?

undefined reference to `__cxa_pure_virtual' 

que he encontrado this document que establece:

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); }

definir esta función como soluciones sugeridas los errores, pero me 'gustaría saber:

  • ¿cuál es el propósito de esta función,
  • por qué debería necesitar definirlo yo mismo y
  • ¿por qué es aceptable codificarlo como un bucle infinito?
+2

Puede obtener este error al usar el comando 'gcc' donde debería usar' g ++ '; Lo he hecho al menos una vez :) – user2023370

Respuesta

32

Si en algún punto del tiempo de ejecución de su programa se crea un objeto con un puntero de función virtual no rellenado, y cuando se llama a la función correspondiente, estará llamando a una 'función virtual pura'.

El controlador que describes debe definirse en las bibliotecas predeterminadas que vienen con tu entorno de desarrollo. Si omite las bibliotecas predeterminadas, encontrará este controlador indefinido: el vinculador ve una declaración, pero no tiene definición. Es entonces cuando debes proporcionar tu propia versión.

El bucle infinito es aceptable porque es un error "fuerte": los usuarios de su software lo notarán inmediatamente. Cualquier otra implementación 'fuerte' es aceptable, también.

+0

¿Qué podría hacer que el puntero de la función virtual no se complete? ¿El compilador no detectaría esto y evitaría la compilación? –

+2

:) eche un vistazo a las preguntas "relacionadas" a la derecha. – xtofl

+0

@xtofl Gracias, http://stackoverflow.com/questions/99552/where-do-pure-virtual-function-call-crashes-come-from fue particularmente útil. –

15

1) ¿Cuál es el propósito de la función __cxa_pure_virtual()?

Las funciones virtuales puras se pueden llamar durante la construcción/destrucción del objeto. Si eso sucede, se llama a __cxa_pure_virtual() para informar el error. Consulte Where do "pure virtual function call" crashes come from?

2) ¿Por qué podría necesitar definirlo 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++.

Arduino IDE logra evitar el error del enlazador al compilar algunos programas porque compila con las opciones "-ffunction-sections -fdata-sections" y enlaces con "-Wl, - gc-sections", lo que reduce un poco referencias a símbolos no utilizados.

3) ¿Por qué es aceptable codificar __cxa_pure_virtual() como un bucle infinito?

Bueno, esto es al menos seguro; hace algo predecible Sería más útil abortar el programa e informar el error. Sin embargo, un bucle infinito sería difícil de depurar, a menos que tenga un depurador que pueda interrumpir la ejecución y dar un seguimiento de la pila.

Cuestiones relacionadas