7

它为面向对象的语言(例如 C++)提供了什么?或者没有它就不能使用GTK+?

假设两个示例使用相同的编译器,就可执行文件的大小和速度而言,对象的GObject实现是否具有与 C++ 类似的质量?或者由于它提供的额外功能,是否有一些权衡GObject会变慢?

4

3 回答 3

7

GObject(有点像 Windows 世界中的 COM)是一个 C API,设计时考虑到了跨语言互操作性。

这意味着您可以在任何支持调用 C 函数的语言中使用GObjects,但这使得用非 C 语言编写真正可从任何语言重用的 GObjects 变得非常困难(如果您用 Python 编写 GObject 派生类) ,每次您想在 C 中使用此类中的对象时,都必须嵌入 Python 解释器)。

可以半自动化地为许多语言(例如 Python、Perl、JS 等)创建绑定,这就是 GObject 的优势之一。这说明了 GObject 提供的 API 有点不透明,我承认,这很难彻底理解。

不幸的是,它也不适合 C++ 语言。GObjects 与 C++ 类没有微不足道的关系,即使绑定可用 (Gtkmm),也无法轻松编写“从 GObject 继承”的 C++ 类并将其公开。您必须为此编写 C。

[世界需要的是对 C++ 语言的某种扩展,这将使与 GObject 的互操作变得容易,有点像 Windows 上的 C++Cx,但是 1) 这是一项艰巨的任务,也许可以通过 GCC 来实现插件,以及 2)在 Gnome 世界或 Linux 世界(KDE 是一个明显的例外)中没有向 C++ 发展的势头。现在我们被 Gtkmm 绑定卡住了。]

于 2011-11-05T14:13:35.527 回答
3

Wikipedia 上有关 GObject 的文章包括与 C++ 的比较。他们提到的一些事情是缺乏多重继承和信号的存在。此外,与 C++ 不同,导出的 C 函数的名称不依赖于您选择的编译器,这让 GObject 受益匪浅。因此,如果您要使用 GObject 开发一个面向对象的库,它可能比 C++ 更容易链接。

看看以 GObject 为目标的Vala编程语言也会很有趣。

于 2011-11-05T14:27:41.910 回答
2

只需对 Vlad 暗示的内容进行一点详细说明:支持 C 的一个主要观点是它使编译器或语言之间的互操作性成为“可能”(保证),因为它使 ABI 标准化。这(如果我过于简单化,请原谅我)可以保证来自任何 C 编译器或其他语言的调用者如何使用导出的符号。因此,为什么 GTK+ 绑定到各种其他语言 - 包括 GTKmm 中的 C++。后者是两全其美的恕我直言:GTK+ 完善的 API,但具有 C++ 的语言特性。

C++ 还没有正式的标准 ABI,尽管一切都还没有丢失,因为 A 团队正在努力:https ://isocpp.org/files/papers/n4028.pdf

于 2016-02-12T09:35:08.163 回答