【问题标题】:Glib - What is the most easy way to execute a GCallback directly?Glib - 直接执行 GCallback 的最简单方法是什么?
【发布时间】:2020-02-10 22:53:29
【问题描述】:

我目前在做什么:

/* FIXME: Actually I just want to call that callback ... no idea how that can be done without using a signal */
/* So I just used some random unused signal for it */
gulong handler_id = g_signal_connect_swapped (window, "direction-changed", (GCallback) mycallback, window);
g_signal_emit_by_name (window,"direction-changed");
g_signal_handler_disconnect (window, handler_id);

效果很好,但很丑陋。

我知道以某种方式使用g_closure_invoke() 调用我的回调是可能的,但到目前为止我还没有让它工作。

如果重要,回调将填充一个如下所示的函数:

static void myCallbackMethod (GtkWindow *window);

【问题讨论】:

    标签: callback glib


    【解决方案1】:

    GCallback 只是某种类型的函数指针。您可以直接调用该函数,就像任何其他 C 函数调用一样。

    mycallback (window);
    

    【讨论】:

    • 应该提到我已经尝试过了。给我一个编译器错误:函数“mycallback”的参数太多..可能我首先需要以某种方式转换函数指针。
    • 好的,我刚刚想通了.. 我需要((void (*)(GtkWindow*))mycallback)(window); 才能让它工作。谢谢你的提示!如果您愿意,请相应地编辑您的答案。只是认为还有一些“gtk - ish”的方法可以做到这一点。
    • 如果您使用正确数量(和类型)的参数调用函数会更好,而不是强制转换它。强制转换函数指针,尤其是更改参数的数量,会在某些(不常见的)平台上给出未指定的行为,并意味着您失去了编译器类型检查的好处。由于您正在进行单个静态函数调用,我想不出您不传递所有适当参数的原因。
    • 现在我很困惑......我应该传递哪些额外的参数?我只有“窗口”作为单个参数,并且我没有将函数强制转换为采用任何其他数量的参数。也许你指的是void (*)?那应该是返回类型和基类型本身(指针)。可能不需要(*),我今晚会检查。您对调用该函数的建议是什么?您回答中的建议不起作用,它给了我一个编译器错误error: too many arguments to function ‘mycallback’,就像我在评论1中所说的那样。
    • 您在 cmets 中提供了两个函数,mycallbackmyCallbackMethod。他们的原型是什么?
    【解决方案2】:

    Philip Withnall 的回答对我有所帮助,但不完整。 (产生编译器错误)

    与普通 C 语言一样,需要将回调强制转换为具体方法,然后才能使用它。在我的情况下(回调返回 void,GtkWindow* 类型的单个参数),以下调用效果很好:

    ((void (*)(GtkWindow*))mycallback)(window);
    

    【讨论】:

    • 我的回答不完整,因为您在问题中提供的代码示例不完整。您的代码示例根本没有声明或定义 mycallback
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2021-12-09
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多