c gtk 警告:初始化从指针生成整数

c gtk warning: initialization makes integer from pointer

如何从 gpointer 获取变量以便使用它。

void
right_y (GtkButton *button, gpointer on)
{
   right(on);
}

这里是回调部分 带有 char on = "y"; 的行给出警告:初始化从指针生成整数而不进行强制转换 [-Wint-conversion]

gsignal 行发出警告:从不同大小的整数转换为指针 [-Wint-to-pointer-cast]

char on = "y";
button = gtk_button_new_with_label ("Led On");                        
g_signal_connect (button, "clicked", G_CALLBACK (right_y), (gpointer) on);

我尝试了几种不同的方法,但仍然无法理解。

谢谢。

char on = "y";

声明 on 持有 一个 char。字符串不止一个 char,因此您需要将它们存储为指向 charchar 数组的指针。

问题是您希望能够用 on 做什么决定了要使用的正确类型。但我想鉴于 post 中错误的性质,您已经知道这一点并且被 gpointer.

搞糊涂了

gpointer基本上就是

typedef void *gpoiner;

这就是为什么您不需要用 gpointer 指定 * 的原因。不要让这愚弄你;当您将其他指针类型与 gpointer 一起使用时,您仍然需要对其他指针类型使用 *

还有g_signal_connect()行是错误的; gpointer on 没有意义。

如果您仍然不明白我在说什么,请告诉我。


好的,那为什么

char on = "y";

吐出消息

warning: initialization makes integer from pointer without a cast [-Wint-conversion]

?

"y" 是一个指针。它的计算结果为 const char * 类型的表达式。该指针可能驻留在可执行文件的代码部分,无法对其进行修改(因此 const)。

char 是整数,不是指针。除非您明确要求,否则您通常不应该能够将指针值转换为整数,因为您最终可能会使用一个太小而无法存储指针的整数类型。 (对于那些必要的时候,C 标准提供了 intptr_tuintptr_t。)在这种情况下,你没有问,所以编译器想确保你真的是想问将指针的地址推送到 char.

注意有关使用比必要的更小的整数的部分。这就是为什么您的 g_signal_connect() 行会打印出它所做的警告:char 不够大,无法存储指针,因此将 char 值视为指针必然会产生非常糟糕的结果。

这就是我要找的代码。

回调相关代码

char *on = 'n';
  button = gtk_button_new_with_label ("Led On");                        
  g_signal_connect (button, "clicked", G_CALLBACK (right_y),  on);

用户功能的代码。

static void
right_y (GtkButton *button, gpointer on)
{
   int led_on = on;
   right(led_on);
}    

以及来自函数 right()

的相关片段
void right(char state) {
   buf[0] = state;
   int  bytes_written  = 0;  
   bytes_written  = write(s, buf, strlen(buf));   
} 

char *on = 'n';行给出了警告

initialization makes pointer from integer without a cast [-Wint-conversion]

我认为这没问题,因为虽然可能有更好的方法来初始化指针,但指针才是我们想要的。

行 int led_on = on; 给出警告

initialization makes integer from pointer without a cast [-Wint-conversion] 

同样可能有更好的方法,但目的是传递变量而不是指针。我试了几次都没有失败,所以我接受了。