我反复遇到在 GTK+ 代码中设置信号处理程序的问题,不需要几个参数,并试图对多个信号使用与处理程序相同的函数,这些信号的处理程序具有不同的签名 - 但使用前 N 个参数(我关心的人)一样。
当这些函数期望的参数少于它们的参数时,将指向函数的指针传递给 GObject API 是否安全(从某种意义上说,它不是未定义的行为,而不是更实用的“它在我的 PC 上工作吗?”)究竟是从信号发射过程中得到的?
或者,将其与 GTK+ 分开,这段代码可以吗?
/* Note: No void *userdata argument! */
void show(int x) {
printf("x = %d\n", x);
}
void do_stuff(void (*fn)(int, void *), void *userdata) {
static int total = 0;
(*fn)(total, userdata);
total++;
}
void doitnow(void) {
do_stuff(&show, NULL);
}
为了获得额外的荣誉,请讨论函数签名和调用站点之间不同返回值类型的含义。
编辑:一个几乎相同的问题更密切地探讨了“兼容函数类型”,并得出了一个直接解决我的具体问题的答案——链接 GObject 信号处理程序的问题。TL;DR:是的,这是未定义的行为,但在某些工具包中它实际上是惯用的(尽管不是强制性的)。