C++ 在C中实现vtable而不是使用C++;

C++ 在C中实现vtable而不是使用C++;,c++,c,gstreamer,C++,C,Gstreamer,我刚刚开始深入研究GStreamer框架,我非常惊讶地发现,尽管它是用纯C编写的,但它使用对象和多态性。然后我发现有可能模仿C.中的一些C++特性,比如继承,它是关于我们自己实现一个虚拟函数表。我对这个想法有点困惑,为什么会有人需要它。如果我必须在C中实现虚拟表和使用C++来实现项目,我一定会使用测试和众所周知的C++语言特性实现。在我看来,整个想法就像是重新发明轮子。使用C中的宏有哪些优点: GST_IS_EVENT(obj) GST_EVENT_CAST(obj) 在C++中: dynam

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

GST_IS_EVENT(obj)
GST_EVENT_CAST(obj)
在C++中:

dynamic_cast<Derived*>(&baseObj);
dynamic_cast(&baseObj);
我能想到两件事:

  • C被更多的人理解得比较好,并且更容易用更多的贡献者来维护代码库
  • C更简单,代码更容易维护

<>在C++上实现VToice有什么技术优势吗?

< P>可能是因为C++提供了比它们所需的更多的特性。


也许他们的OOP模型与C++所提供的不一样。

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

C++是另一回事。例如,C++的VTABLE没有标准的ABI。此外,为了支持方法和函数重载和名称空间,C++对符号进行命名。异常是影响函数调用方式的另一个因素,即使使用同一个编译器,也可能需要特定的编译器开关


<> P>可以用C++编写“C”,只导出代码>外部“C”/Cuth>符号,但是如果你这样做,你也可以使用C来避免混合语言的复杂性。Linux内核一直都在这样做。仅仅因为你的语言没有给你工具使事情变得方便并不意味着它使事情变得不可能。最终,任何东西都可以在汇编中实现。其中一个原因是,当您生成库或其他代码片段以与其他外部代码共享时,这可能是必须的,即,在C++实现之后的内存管理和其他动态功能在来自不同编译器的代码上可能是不一致的,甚至是冲突的。在纯C上编写所有的东西,可以有效地实现每种类型,几乎混合任何语言和编译器。C++编译器/生态系统不是1999的今天。如果你正在编写一个你想让代码> C < /代码>程序员能够使用的库,那么你就不能使用<代码> C++< /Cord>多态性。RE:“有可能模仿C++中的一些C++特性,比如在C++中继承”——回到过去,C++是由cFrand编译的,它产生了C代码,然后由C编译器编译。