__cxa_pure_virtual的目的是什么?

Mat*_*och 53 c++ pure-virtual avr-gcc

在使用avr-gcc进行编译时,我遇到了链接器错误,如下所示:

undefined reference to `__cxa_pure_virtual'
Run Code Online (Sandbox Code Playgroud)

我发现这个文件说明:

__cxa_pure_virtual函数是在调用纯虚函数时调用的错误处理程序.

如果您正在编写具有纯虚函数的C++应用程序,则必须提供自己的__cxa_pure_virtual错误处理函数.例如:

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

根据建议定义此函数可以修复错误,但我想知道:

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

xto*_*ofl 39

如果在程序的运行时中的任何地方创建一个对象,其中未填充虚拟函数指针,并且在调用相应的函数时,您将调用"纯虚函数".

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

无限循环是可以接受的,因为它是一个"响亮"的错误:软件的用户会立即注意到它.任何其他"响亮"的实现也是可以接受的.

  • :)查看右边的"相关"问题. (2认同)

Mar*_*orn 22

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

在构造/销毁对象期间可以调用纯虚函数.如果发生这种情况,将调用__cxa_pure_virtual()来报告错误.请参阅"纯虚函数调用"崩溃的来源?

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

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

Arduino IDE在构建某些程序时设法避免链接器错误,因为它使用选项"-ffunction-sections -fdata-sections"和带有"-Wl,-gc-sections"的链接进行编译,这会删除对未使用符号的一些引用.

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

嗯,这至少是安全的; 它做了一些可预测的事情.中止程序并报告错误会更有用.但是,无限循环调试会很麻烦,除非你有一个可以中断执行并给出堆栈回溯的调试器.