GObject 库提供了一些内置编组器 https://docs.gtk.org/gobject/struct.CClosure.html,所以你的代码可能应该是:
g_signal_new("child-finished",
G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST,
0, NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1, G_TYPE_POINTER);
或者,如果您想要类型检查:
g_signal_new("child-finished",
G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST,
0, NULL, NULL,
g_cclosure_marshal_VOID__BOXED,
G_TYPE_NONE, 1, GDK_TYPE_EVENT);
信号处理程序的参数must存在(隐含对象本身),因此请务必指定指针(如第一个示例中)或装箱类型(如第二个示例中)。
如果您需要的编组器不存在于内置编组器中,您可以使用油嘴滑舌的元帅 http://manpages.ubuntu.com/manpages/jammy/en/man1/glib-genmarshal.1.html实用程序或直接自己编写代码(这非常简单,只需检查 glib-genmarshal 的输出)。