我刚刚开始深入研究GStreamer框架,我非常惊讶地发现,尽管事实上它是用纯C语言编写的,但它使用了对象和多态性。然后我发现可以在C语言中模拟某些C ++功能,例如继承。这是关于我们自己实现虚拟函数表的信息。我对这个想法有些困惑,为什么有人需要它。如果必须在用C实现虚拟表和在项目中使用C ++之间进行选择,那么我肯定会使用经过测试且众所周知的C ++语言功能实现。在我看来,整个想法就像重新发明轮子。在C中拥有宏的好处是什么:
GST_IS_EVENT(obj)
GST_EVENT_CAST(obj)
在C ++中:
dynamic_cast<Derived*>(&baseObj);
我可以想到两件事:
与通过C ++实现vtable相比,C有什么技术优势吗?
最重要的原因是,至少在Linux,Windows和Mac上,C库ABI还是标准库ABI。换句话说,可以从任何语言(支持使用外部库)使用这些库。
C ++是另外一个故事。例如,对于C ++ vtable没有标准的ABI。另外,为了支持方法和函数重载以及名称空间,C ++确实对符号进行名称修饰。然后,异常又影响了函数的调用方式,即使使用相同的编译器,异常甚至可能需要特定的编译器开关。
[可以用C ++编写“ C”,而只导出extern "C"
符号,但是如果这样做,您最好也使用C来避免混合语言的复杂性。
可能是因为C ++提供了比其项目所需的功能更多的功能。
也许他们的OOP模型不同于C ++提供的模型。