__cxa_pure_virtual 的目的是啥?
Posted
技术标签:
【中文标题】__cxa_pure_virtual 的目的是啥?【英文标题】:What is the purpose of __cxa_pure_virtual?__cxa_pure_virtual 的目的是什么? 【发布时间】:2010-10-29 13:29:18 【问题描述】:在使用 avr-gcc 进行编译时,我遇到了如下链接器错误:
undefined reference to `__cxa_pure_virtual'
我发现this document 声明:
__cxa_pure_virtual
函数是一个错误处理程序,在调用纯虚函数时会被调用。如果您正在编写具有纯虚函数的 C++ 应用程序,您必须提供自己的
__cxa_pure_virtual
错误处理函数。例如:
extern "C" void __cxa_pure_virtual() while (1);
按照建议定义此函数可修复错误,但我想知道:
这个函数的目的是什么, 为什么我需要自己定义它和 为什么可以将其编码为无限循环?【问题讨论】:
您在使用gcc
命令时可能会收到此错误,而您应该使用g++
;我至少做过一次:)
【参考方案1】:
如果在程序运行时的任何地方创建了一个未填充虚函数指针的对象,并且当调用相应的函数时,您将调用一个“纯虚函数”。
您描述的处理程序应该在您的开发环境附带的默认库中定义。如果您碰巧忽略了默认库,您会发现此处理程序未定义:链接器看到一个声明,但没有定义。那时您需要提供自己的版本。
无限循环是可以接受的,因为它是一个“响亮”的错误:您的软件的用户会立即注意到它。任何其他“响亮”的实现也是可以接受的。
【讨论】:
虚函数指针填不上的原因是什么?编译器不会检测到这一点并阻止编译吗? @xtofl 谢谢,***.com/questions/99552/… 特别有帮助。【参考方案2】:1) __cxa_pure_virtual() 函数的作用是什么?
可以在对象构造/销毁期间调用纯虚函数。如果发生这种情况,会调用 __cxa_pure_virtual() 来报告错误。见Where do "pure virtual function call" crashes come from?
2) 为什么您需要自己定义它?
这个函数通常由 libstdc++ 提供(例如在 Linux 上),但 avr-gcc 和 Arduino 工具链不提供 libstdc++。
Arduino IDE 在构建某些程序时设法避免链接器错误,因为它使用选项“-ffunction-sections -fdata-sections”进行编译并使用“-Wl,--gc-sections”链接,这会删除一些引用到未使用的符号。
3) 为什么可以将 __cxa_pure_virtual() 编码为无限循环?
嗯,这至少是安全的;它做了一些可预测的事情。中止程序并报告错误会更有用。但是,无限循环很难调试,除非您有一个可以中断执行并提供堆栈回溯的调试器。
【讨论】:
以上是关于__cxa_pure_virtual 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章