如何使用g_signal_handlers_block_by_func()

时间:2019-04-18 15:21:42

标签: c gtk3

我听着GtkComboBox的“变化”信号。我清空并填充GtkComboBoxText,这是GtkComboBox的简单变体。我正在尝试使用宏g_signal_handlers_block_by_func(instance, func, data),以便在清空并重新填充该框时不会将“已更改”的信号发送到我的回调函数中。

在将函数作为函数传递时出错:错误:ISO C禁止在函数指针和“ void *”之间传递参数“ g_signal_handlers_block_matched”的参数6 [-Werror = pedantic]

之所以发生这种情况,是因为func被强制转换为{{1}的typedef到gpointer中的(void*))。据我所知,将函数指针转换为数据指针是非法的。

示例:

g_signal_handlers_block_matched

也尝试了不使用G_CALLBACK的情况,但这没有什么不同。问题是一样的。

我应该如何使用static void my_callback(GtkComboBox *box, GtkComboBox *other_box) { // Some code here } g_signal_connect(combo_box, "changed", G_CALLBACK(my_callback), other_box); // To temporary block changed signals for reaching other_box: g_signal_handlers_block_by_func(combo_box, G_CALLBACK(my_callback), other_box);

1 个答案:

答案 0 :(得分:1)

GObject和GLib要求在将函数指针转换为void*时反之亦然。”

来自build codeGLib wiki

  

GLib严重依赖于将函数指针转换为void*并再次无损返回的能力。任何不支持此功能的平台或编译器都不能用于编译GLib或使用GLib的代码。这排除了将-pedantic GCC标志与GLib一起使用。