__cxa_pure_virtual的目的是什么?

在编译avr-gcc的同时,我遇到了如下的链接错误:

undefined reference to `__cxa_pure_virtual' 

我发现这个文件说:

__cxa_pure_virtual函数是调用纯虚函数时调用的error handling函数。

如果您正在编写具有纯虚函数的C ++应用程序,则必须提供您自己的__cxa_pure_virtualerror handling函数。 例如:

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

定义这个函数build议修复错误,但我想知道:

  • 这个function的目的是什么,
  • 为什么我需要自己定义它
  • 为什么把它编码成一个无限循环是可以接受的?

如果程序的运行时在任何地方创build了一个对象,并且没有填充虚拟函数指针,当调用相应的函数时,您将调用一个“纯虚函数”。

您描述的处理程序应该在开发环境附带的默认库中定义。 如果你碰巧忽略了默认的库,你会发现这个处理程序没有定义:链接器看到一个声明,但没有定义。 那时你需要提供你自己的版本。

无限循环是可以接受的,因为这是一个“响亮的”错误:您的软件的用户将立即注意到它。 任何其他的“大声”执行也是可以接受的。

1)函数__cxa_pure_virtual()的目的是什么?

纯虚函数可以在对象构造/销毁期间被调用。 如果发生这种情况,调用__cxa_pure_virtual()来报告错误。 请参阅“纯虚函数调用”崩溃从何而来?

2)为什么你需要自己定义它?

通常这个函数是由libstdc ++提供的(例如在Linux上),但是avr-gcc和Arduino工具链不提供libstdc ++。

Arduino IDE在构build某些程序的时候避免了链接器的错误,因为它编译选项“-ffunction-sections -fdata-sections”和链接到“-Wl, – gc-sections”,这些选项会删除一些对未使用符号的引用。

3)为什么将__cxa_pure_virtual()编码为无限循环是可以接受的?

那么,这至less是安全的; 它做了一些可预测的事情。 中止程序并报告错误会更有用。 尽pipe如此,一个无限循环将很难debugging,除非你有一个debugging器可以中断执行并给出栈回溯。