【问题标题】:In what way is gobject facilitating binding?gobject 以何种方式促进绑定?
【发布时间】:2017-06-29 21:08:40
【问题描述】:

the official website of gobject,我们可以阅读:

GTK+ 和大多数 GNOME 库使用 GObject 及其较低级别的类型系统 GType 来提供:

  • 基于 C 的面向对象的 API 和
  • 自动透明 API 绑定到其他编译或解释 语言

第一部分对我来说似乎很清楚,但第二部分不是。

确实,在谈到 gobject 和绑定时,引入的概念通常是 gobject-introspection,但据我了解,gobject-introspection 可用于为任何有文档的 C 库创建 .gir 和 .typelib,而不仅仅是用于基于 gobject 的库。

因此我想知道是什么让 gobject 对绑定特别友好。

【问题讨论】:

    标签: gobject gobject-introspection


    【解决方案1】:

    据我了解,gobject-introspection 可用于为任何已记录的 C 库创建 .gir 和 .typelib,而不仅仅是基于 gobject 的库。

    实际情况并非如此。您可以做一些非常基本的事情,但您必须手动编写 GIR(而不仅仅是运行一个扫描源代码的程序)。我知道的只有those distributed with gobject-introspection(*.gir 文件、*.c 文件是为了避免循环依赖),甚至那些通常也只是 C API 的一个相当小的子集。

    至于其他功能,GObject 中的几乎所有功能都有帮助……基本思想是绑定通常需要 RTTI。有像GValue(一个简单的盒子来存储值+类型信息),GClosure(用于回调),属性和信号用GTypes,描述自己的类型。如果您使用 GObjects(而不是创建新的基本类型),您将获得有关继承和接口的运行时数据,而且 GObject 奇怪的构造方案甚至允许其他语言对 C 中声明的类型进行子类化。

    g-ir-scanner 在非 GObject 库上不能做太多事情的原因是所有这些信息都丢失了。在扫描源代码寻找注解之后,g-ir-scanner 将实际加载编译后的模块并使用 GObject 的 API 来获取这些信息(这使得交叉编译很痛苦)。换句话说,GObject-Introspection 是一个比你想象的要小得多的项目……它所需的大量数据来自 GObject API。

    【讨论】:

    • 谢谢,我不知道g-ir-scanner 是这样使用 GObject 的。至于 RTTI,这对非解释语言真的有用吗?例如,它在 PyGObject 中成功使用,但在编译语言中是否有意义?
    • 如果您 s/解释/动态键入/,这更有意义。但答案是肯定的;当您没有静态类型信息时,它绝对更多有用,但是在 C 中有很多情况,您可以通过使用 GValue 或添加 GType 之类的东西来避免一遍又一遍地重写相同的代码参数。
    • 你能举个例子来说明你的最后一句话吗?
    • 第一个想到的,我不知道为什么,是 API,如数据库的准备语句,或解析数据格式(想想 json)。您是否不想避免在 API 的每个级别使用 set_int、set_uint(unsigned int value)、set_double(double)、set_string(char*)、set_data(uint8_t*) 等,或者您宁愿只拥有单个 set_value(GValue* 值)?像 GBinding (developer.gnome.org/gobject/stable/GBinding.html) 这样的东西怎么样?如果您熟悉具有泛型或模板的语言,基本上任何时候您都会使用其中之一。
    猜你喜欢
    • 2019-01-29
    • 2016-10-24
    • 2016-02-27
    • 1970-01-01
    • 2015-10-12
    • 2017-09-05
    • 2014-02-13
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多