在 C 中实现 vtable 而不是使用 C++ 的目的
Purpose of implementing vtable in C instead of using C++
我刚刚开始研究 GStreamer 框架,我非常惊讶地发现,尽管它是用纯 C 编写的,但它使用了对象和多态性。然后我发现可以在C中模拟一些C++的特性,比如继承。它是关于我们自己实现一个虚函数table。我对这个想法有点困惑,为什么有人需要它。如果我不得不在 C 中实现虚拟 tables 和为项目使用 C++ 之间做出选择,我肯定会使用经过测试和众所周知的 C++ 语言功能实现。整个想法在我看来就像重新发明轮子。在 C:
中使用宏有什么好处
GST_IS_EVENT(obj)
GST_EVENT_CAST(obj)
在 C++ 中:
dynamic_cast<Derived*>(&baseObj);
我能想到的有两点:
- C 被更多人理解,并且有更多的贡献者更容易维护代码库
- C更简单,代码更容易维护
与 C++ 相比,C 在实现 vtable 方面有什么技术优势吗?
可能是因为 C++ 提供的功能比他们的项目需要的多得多。
可能他们的OOP模型和C++提供的不一样
最重要的原因是,C 库 ABI 至少在 Linux 和 Windows 和 Mac 上也是标准库 ABI。换句话说,这些库可以从任何语言(支持使用外部库)使用。
C++ 是另一回事。例如,C++ vtable 没有标准的 ABI。此外,为了支持方法和函数重载以及命名空间,C++ 对符号进行了名称重整。然后异常是影响函数调用方式的另一件事,即使使用相同的编译器,它甚至可能需要特定的编译器开关。
可以只用 C++ 编写 "C",并仅导出 extern "C"
个符号,但如果这样做,您最好使用 C 来避免混合语言的复杂性。
我刚刚开始研究 GStreamer 框架,我非常惊讶地发现,尽管它是用纯 C 编写的,但它使用了对象和多态性。然后我发现可以在C中模拟一些C++的特性,比如继承。它是关于我们自己实现一个虚函数table。我对这个想法有点困惑,为什么有人需要它。如果我不得不在 C 中实现虚拟 tables 和为项目使用 C++ 之间做出选择,我肯定会使用经过测试和众所周知的 C++ 语言功能实现。整个想法在我看来就像重新发明轮子。在 C:
中使用宏有什么好处GST_IS_EVENT(obj)
GST_EVENT_CAST(obj)
在 C++ 中:
dynamic_cast<Derived*>(&baseObj);
我能想到的有两点:
- C 被更多人理解,并且有更多的贡献者更容易维护代码库
- C更简单,代码更容易维护
与 C++ 相比,C 在实现 vtable 方面有什么技术优势吗?
可能是因为 C++ 提供的功能比他们的项目需要的多得多。
可能他们的OOP模型和C++提供的不一样
最重要的原因是,C 库 ABI 至少在 Linux 和 Windows 和 Mac 上也是标准库 ABI。换句话说,这些库可以从任何语言(支持使用外部库)使用。
C++ 是另一回事。例如,C++ vtable 没有标准的 ABI。此外,为了支持方法和函数重载以及命名空间,C++ 对符号进行了名称重整。然后异常是影响函数调用方式的另一件事,即使使用相同的编译器,它甚至可能需要特定的编译器开关。
可以只用 C++ 编写 "C",并仅导出 extern "C"
个符号,但如果这样做,您最好使用 C 来避免混合语言的复杂性。