c++ - 用 C 而不是使用 C++ 实现 vtable 的目的

标签 c++ c gstreamer

我刚刚开始深入研究 GStreamer 框架,我非常惊讶地发现,尽管它是用纯 C 语言编写的,但它使用对象和多态性。然后我发现可以在C中模拟一些C++功能,例如继承。这是关于我们自己实现一个虚拟函数表。我对这个想法有点困惑为什么有人需要它。如果我必须在用 C 实现虚拟表和使用 C++ 进行项目之间做出选择,我肯定会使用经过测试且众所周知的 C++ 语言功能实现。在我看来,整个想法就像是重新发明轮子。在 C: 中使用宏有什么优点:

GST_IS_EVENT(obj)
GST_EVENT_CAST(obj)

在 C++ 中:

dynamic_cast<Derived*>(&baseObj);

我能想到两件事:

  • C 语言被更多人理解,并且有更多贡献者更容易维护代码库
  • C 更简单,代码更容易维护

与 C++ 相比,C 实现 vtable 有何技术优势?

最佳答案

最重要的原因是,C 库 ABI 至少在 Linux、Windows 和 Mac 上也是标准库 ABI。换句话说,这些库可以从任何语言(支持使用外部库)使用。

C++ 则不同。例如,C++ vtable 没有标准 ABI。此外,为了支持方法和函数重载以及 namespace ,C++ 对符号进行名称修饰。然后,异常是影响函数调用方式的另一件事,即使使用相同的编译器,甚至可能需要特定的编译器开关。

可以只用 C++ 编写“C”,并仅导出 extern“C” 符号,但如果这样做,您不妨使用 C 来避免混合语言的复杂性.

关于c++ - 用 C 而不是使用 C++ 实现 vtable 的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58781033/

相关文章:

c - Sky mote 的 Contiki Cooja 模拟中的 Energest CPU 读数正在下降

c++ - gstreamer 桌面 rtsp 流延迟 4 秒

windows - 由于缺少glib-2.0,因此无法在Windows上编译gstreamer

c++ - 如何在 CMainFrame 中处理鼠标点击

c++ - boost ASIO SSL 收到的字节数

c++ - 如何在 C++ 中生成无向图?

c - 使用 main() 函数递归

带有继承列表的 C++ 模板声明

c - 缓冲 io 和非缓冲 io 之间的区别

python - ImportError: [libraryname].so: undefined symbol: [函数名]