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?
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top