c++ avr-gcc pure-virtual

c++ - ¿Cuál es el propósito de__cxa_pure_virtual?



avr-gcc pure-virtual (2)

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

Se pueden llamar funciones virtuales puras durante la construcción / destrucción de objetos. Si eso sucede, se llama a __cxa_pure_virtual () para informar el error. Ver ¿De dónde vienen los bloqueos de "llamadas a funciones virtuales puras"?

2) ¿Por qué necesitarías definirlo tú 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 Arduino IDE logra evitar el error del enlazador cuando construye algunos programas porque compila con las opciones "-ffunction-sections -fdata-sections" y enlaces con "-Wl, - gc-sections", que omite 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 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.

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

undefined reference to `__cxa_pure_virtual''

Encontré este documento que dice:

La función __cxa_pure_virtual es un controlador 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 __cxa_pure_virtual controlador de errores. Por ejemplo:

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

Definir esta función como sugerida corrige 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?

Si en algún lugar en el 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 estar definido 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 ciclo 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.