¿Cuál es el propósito de cxa pure virtual?


Mientras compilaba con avr-gcc he encontrado errores de enlazador como los siguientes:

undefined reference to `__cxa_pure_virtual'

He encontrado este documento que dice:

La función __cxa_pure_virtual es un manejador de errores que se invoca cuando se llama a una función virtual pura.

Si está escribiendo una aplicación C++ que tiene funciones virtuales puras, debe proporcionar su propia función de controlador de errores __cxa_pure_virtual. Por ejemplo:

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

Definiendo esta función como sugiere corrige los errores, pero me gustaría saber:

  • cuál es el propósito de esta función,
  • por qué debería tener que definirlo yo mismo y {[22]]}
  • ¿por qué es aceptable codificarlo como un bucle infinito?
Author: Matthew Murdoch, 2009-05-28

2 answers

Si en cualquier lugar 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 describe debe estar definido en las bibliotecas predeterminadas que vienen con su entorno de desarrollo. Si omite las bibliotecas predeterminadas, encontrará este controlador indefinido: el enlazador ve una declaración, pero no una definición. Ahí es cuando necesitas proporcione su 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 "ruidosa" también es aceptable.

 36
Author: xtofl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-28 12:02:23

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

Las funciones virtuales puras pueden ser llamadas durante la construcción/destrucción de objetos. Si esto sucede, se llama a __cxa_pure_virtual() para reportar el error. Ver ¿De dónde vienen los bloqueos de "llamada a función virtual pura"?

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++.

El IDE de Arduino logra evitar el error del enlazador al compilar algunos programas porque compila con las opciones "-ffunction-sections-fdata-sections" y enlaza con "-Wl, gc gc-sections", lo que elimina algunas 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 y reportar el error. Infinito loop sería incómodo de depurar, sin embargo, a menos que tenga un depurador que pueda interrumpir la ejecución y dar una traza inversa de la pila.

 17
Author: Mark Seaborn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:46