__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 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

`__metaclass__ = type` 的目的是啥?

检查 self.__class__ 的目的是啥?

HexRays - “__OFSUB__()”的目的是啥?

元类 __init__ 方法的 dct 参数的目的是啥?

目的是啥:@synthesize variableName = __ variableName;

require_once dirname(__FILE__) ...的目的是啥?