c GTK g_signal_connect 使用数据域

c GTK g_signal_connect using the data field

使用 g_signal 连接,我尝试使用 "data" 字段传递一个简单字符 'S' 的参数。

???(我想我明白该字段不是用于数据,而是用于指向数据的指针。)???

无论如何,我有这样的代码:

g_signal_connect (G_OBJECT(b_save), "clicked", my_test, (gpointer) 'S');

像这样调用代码:

void my_test(GtkMenuItem *menuitem, gpointer data)
{
  printf("Pointer variable contains: %p\n", data);
}

我不确定 my_test 应该接受两个参数还是一个? 我不确定如何打印指向的值 'S'。 (在我调用的函数 my_test 中,我如何获得 'S'?)

'S'是一个字符常量。与字符串文字不同,字符常量不可寻址,它们只是伪装的数字。因此回调中的数据参数不包含指向 'S' 的指针(不超过它可以包含指向常量 1 的指针),而是将常量的值重新解释为 gpointer.

如果您的 C 实现保证整数和指针之间的一对一映射,您可以保留您的设置,并像这样打印您的回调:

printf("Data variable contains: %c\n", (char)data); // char and NOT char*

如果你想传递地址,那么你需要传递一些存储的地址。更重要的是,在执行回调之前不会过期的存储。动态分配内存可能是最好的,但您也可以传递静态变量的地址:

static char data = 'S';
g_signal_connect (G_OBJECT(b_save), "clicked", my_test, &data);
// ...
printf("Data variable contains: %c\n", *(char*)data); // Now data is a pointer to a single character.