首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >__cxa_pure_virtual的目的是什么?

__cxa_pure_virtual的目的是什么?
EN

Stack Overflow用户
提问于 2009-05-28 11:55:10
回答 2查看 50.6K关注 0票数 64

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

代码语言:javascript
运行
复制
undefined reference to `__cxa_pure_virtual'

我找到了本文件,上面写着:

__cxa_pure_virtual函数是在调用纯虚拟函数时调用的错误处理程序。 如果要编写具有纯虚拟函数的C++应用程序,则必须提供自己的__cxa_pure_virtual错误处理函数。例如: extern "C" void __cxa_pure_virtual() { while (1); }

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

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-28 12:02:23

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

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

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

票数 45
EN

Stack Overflow用户

发布于 2012-02-20 02:38:25

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

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

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

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

Arduino IDE在构建某些程序时设法避免了链接器错误,因为它使用了选项“-ffunction fdata-sections”和"-Wl -gc-sections“链接,后者删除了对未使用符号的引用。

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

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

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/920500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档