如何从 gpointer 获取变量以便我可以使用它。
void
right_y (GtkButton *button, gpointer on)
{
right(on);
}
这里是回调部分 带有 char = "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
,因此您需要将它们存储为指向 char
的指针或指向 char
数组的指针。
问题是您希望能够使用 on
执行的操作确定要使用的正确类型。但我想考虑到帖子中错误的性质,您已经知道这一点并且对 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_t
和 uintptr_t
。)在这种情况下,您没有询问,因此编译器希望确保您实际上意味着您想将指针的地址放入 char
中。
请注意有关使用比必要的更小的整数的部分。这就是为什么您的 g_signal_connect()
行会打印这样的警告:char
不够大,无法存储指针,因此将 char
值视为指针必然会产生非常糟糕的结果。
关于cgtk警告: initialization makes integer from pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41798052/