• glib g_signal_new 参数用法


    1. g_signal_new ("hello",
    2. G_TYPE_FROM_CLASS (klass),
    3. G_SIGNAL_RUN_FIRST,
    4. G_STRUCT_OFFSET (SignalDemoClass, default_handler),
    5. NULL,
    6. NULL,
    7. g_cclosure_marshal_VOID__STRING,
    8. G_TYPE_NONE,
    9. 1,
    10. G_TYPE_STRING);

     g_signal_new 函数的参数:

    • 第 1 个参数是字符串“hello”,它表示信号
    • 第 2 个参数是 SignalDemo 类的类型 ID,可以使用 G_TYPE_FROM_CLASS 宏从 SignalDemoClass 结构体中获取,也可直接使用 signal-demo.h 中定义的宏 SIGNAL_TYPE_DEMO。
    • 第 3 个参数可暂时略过。
    • 第 4 个参数比较关键,它是一个内存偏移量,主要用于从 SignalDemoClass 结构体中找到 default_handler 指针的位置,可以使用 G_STRUCT_OFFSET 宏来获取,也可以直接根据 signal-demo.h 中的 SignalDemoClass 结构体的定义,使用 sizeof (GObjectClass) 来得到内存偏移量,因为 default_handler 指针之前只有一个 GObjectClass 结构体成员。
    • 第 5 个和第 6 个参数暂时略过。
    • 第 7 个参数设定闭包的  marshal。在文档“” 中,描述了 GObject 的闭包的概念与结构,我们可以将它视为回调函数 + 上下文环境而构成的一种数据结构,或者再简单一点,将其视为回调函数。另外,在那篇文档中,我们也对 marshal 的概念进行了一些粗浅的解释。事实上 marshal 主要是用来“翻译”闭包的参数和返回值类型的,它将翻译的结果传递给闭包。之所以不直接调用闭包,而是在其外加了一层 marshal 的包装,主要是方便 GObject 库与其他语言的绑定。例如,我们可以写一个 pyg_closure_marshal_VOID__STRING 函数,其中可以调用 python 语言编写的“闭包”并将其计算结果传递给 GValue 容器,然后再从 GValue 容器中提取计算结果。
    • 第 8 个参数指定 marshal 函数的返回值类型。由于本例的第 7 个参数所指定的 marshal 是 g_cclosure_marshal_VOID__STRING 函数的返回值是 void,而 void 类型在 GObject 库的类型管理系统是 G_TYPE_NONE 类型。
    • 第 9 个参数指定 g_signal_new 函数向 marshal 函数传递的参数个数,由于本例使用的 marshal 函数是 g_cclosure_marshal_VOID__STRING 函数,g_signal_new 函数只向其传递 1 个参数。
    • 第 10 个参数是可变参数,其数量由第 8 个参数决定,用于指定 g_signal_new 函数向 marshal 函数传递的参数类型。由于本例使用的 marshal 函数是 g_cclosure_marshal_VOID__STRING 函数,并且 g_signal_new 函数只向其传递一个参数,所以传入的参数类型为 G_TYPE_STRING(GObject 库类型管理系统中的字符串类型)
  • 相关阅读:
    Vue插件(Plugin)、动态组件(component)和混入(mixin)介绍
    unity教程
    数据库定时备份linux篇
    stu01-IDEA怎么创建一个HTML项目
    SAP ABAP BAPI_MATERIAL_BOM_GROUP_CREATE DEMO
    Pose泰裤辣! 一键提取姿态生成新图像
    工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计
    Python元组(Tuple)定义和操作示例
    字节跳动虚拟数字人技术与应用
    高压放大器在金属材料静电悬浮过程中的应用
  • 原文地址:https://blog.csdn.net/hyl999/article/details/125505589