【发布时间】:2011-12-22 16:00:00
【问题描述】:
它为 C++ 等面向对象的语言提供了什么?或者没有它就不能使用GTK+?
假设两个示例使用相同的编译器,就可执行文件的大小和速度而言,对象的GObject 实现是否具有与 C++ 相似的质量?或者,由于它提供的额外功能,GObject 的速度会变慢吗?
【问题讨论】:
它为 C++ 等面向对象的语言提供了什么?或者没有它就不能使用GTK+?
假设两个示例使用相同的编译器,就可执行文件的大小和速度而言,对象的GObject 实现是否具有与 C++ 相似的质量?或者,由于它提供的额外功能,GObject 的速度会变慢吗?
【问题讨论】:
GObject(有点像 Windows 世界中的 COM)是一种 C API,设计时考虑到了跨语言互操作性。
这意味着您可以在任何支持调用 C 函数的语言中使用 GObject,但这使得用非 C 语言编写真正可从任何语言重用的 GObject(如果你用 Python 编写一个 GObject 派生类,每次你想在 C 中使用这个类中的对象时,你都必须嵌入一个 Python 解释器。
可以半自动化地为许多语言(例如 Python、Perl、JS 等)创建绑定,这就是 GObject 的优势之一。这说明了 GObject 提供的 API 有点不透明,我承认,这很难彻底理解。
不幸的是,它也不适合 C++ 语言。 GObjects 与 C++ 类没有微不足道的关系,即使 bindings 可用 (Gtkmm),也不可能轻松地编写“从 GObject 继承”的 C++ 类并将其公开。您必须为此编写 C。
[世界需要的是对 C++ 语言的某种扩展,这将使与 GObject 的互操作变得容易,有点像 Windows 上的 C++Cx,但是 1) 这是一项艰巨的任务,也许可以通过 GCC 插件实现,并且 2) 在 Gnome 世界或一般在 Linux 世界(KDE 是一个明显的例外)中,没有向 C++ 发展的势头。现在我们被 Gtkmm 绑定卡住了。]
【讨论】:
Wikipedia 上关于 GObject 的文章包括 comparison with C++。他们提到的一些事情是缺乏多重继承和信号的存在。此外,与 C++ 不同,导出的 C 函数的名称不依赖于您选择的编译器,这让 GObject 受益匪浅。因此,如果您要使用 GObject 开发一个面向对象的库,它可能比 C++ 更容易链接。
看看Vala 编程语言也会很有趣,它以 GObject 为目标。
【讨论】:
对 Vlad 所暗示的内容稍作阐述:支持 C 的一个主要观点是,它使编译器或语言之间的互操作性成为“可能”(保证),因为它标准化了 ABI。这(如果我过于简单化,请原谅我)可以保证来自任何 C 编译器或其他语言的调用者如何使用导出的符号。因此,为什么 GTK+ 绑定到各种其他语言——包括 GTKmm 中的 C++。后者是两全其美的恕我直言:GTK+ 完善的 API,但具有 C++ 的语言特性。
C++ 还没有正式的标准 ABI,但一切都还没有丢失,因为 A 团队正在努力:https://isocpp.org/files/papers/n4028.pdf
【讨论】: