Qual é o propósito de __cxa_pure_virtual?
-
06-09-2019 - |
Pergunta
Embora compilar com avr-gcc eu encontrei vinculador erros como o seguinte:
undefined reference to `__cxa_pure_virtual'
Eu encontrei este documento que estados :
A função
__cxa_pure_virtual
é um manipulador de erro que é invocado quando uma função virtual pura é chamado.Se você estiver escrevendo um aplicativo de C ++ que tem funções virtuais puras você deve fornecer sua própria função de manipulador de erro
__cxa_pure_virtual
. Por exemplo:
extern "C" void __cxa_pure_virtual() { while (1); }
Definindo esta função como correções sugeridas os erros, mas eu gostaria de saber:
- qual é o propósito desta função é,
- por que eu deveria precisa definir isso sozinho e
- por isso que é aceitável para o código-lo como um loop infinito?
Solução
Se em qualquer lugar do tempo de execução do seu programa de um objeto é criado com um ponteiro de função virtual não preenchido, e quando a função correspondente é chamado, você estará chamando a 'função virtual pura'.
O manipulador você descreve deve ser definido nas bibliotecas padrão que vêm com o seu ambiente de desenvolvimento. Se acontecer de você omitir as bibliotecas padrão, você vai encontrar este manipulador indefinido: o vinculador vê uma declaração, mas nenhuma definição. Isso é quando você precisa fornecer sua própria versão.
O loop infinito é aceitável porque é um erro 'alto': os usuários de seu software vai notar-la imediatamente. Qualquer outra aplicação 'alto' é aceitável também.
Outras dicas
1) Qual é a finalidade do __cxa_pure_virtual function ()?
funções virtuais puros podem obter chamado durante a construção objeto / destruição. Se isso acontecer, __cxa_pure_virtual () é chamado para relatar o erro. Consulte Onde fazer "pura chamada de função virtual" falhas vem?
2) Por que você precisa definir isso sozinho?
Normalmente esta função é fornecida por libstdc ++ (por exemplo em Linux), mas AVR-GCC e o conjunto de ferramentas Arduino não fornecem uma libstdc ++.
O Arduino IDE consegue evitar o erro de vinculador quando a construção de alguns programas porque ele compila com as opções "-ffunction-seções -fdata-seções" e links com "-Wl, - GC-seções", que cai algumas referências aos símbolos não utilizados.
3) Por que é aceitável para __cxa_pure_virtual código () como um loop infinito?
Bem, isto é, pelo menos seguro; ele faz algo previsível. Seria mais útil para abortar o programa e relatar o erro. Um loop infinito seria estranho para depurar, porém, a menos que tenha um depurador que pode interromper a execução e dar um backtrace pilha.