C和GTK通过参数
以下程序将不会编译。我将代码简化为这个简单的程序。我已经发布了compile命令及其输出C和GTK通过参数,c,gtk3,C,Gtk3,以下程序将不会编译。我将代码简化为这个简单的程序。我已经发布了compile命令及其输出 #include <gtk/gtk.h> void update_label(GtkLabel *glab); void update_label(GtkLabel *glab) { } int main(int argc, char *argv[]) { GtkWidget *lbl; gtk_init(&argc, &argv); lbl = gtk_l
#include <gtk/gtk.h>
void update_label(GtkLabel *glab);
void update_label(GtkLabel *glab)
{
}
int main(int argc, char *argv[])
{
GtkWidget *lbl;
gtk_init(&argc, &argv);
lbl = gtk_label_new("Hi");
update_label(lbl);
gtk_main();
return 0;
}
您将
update\u label
声明为接受GtkLabel*
参数:
void update_label(GtkLabel *glab);
另一方面,您将传递类型为GtkWidget*
的参数lbl
:
GtkWidget *lbl;
(...)
update_label(lbl);
这就是为什么编译器会引发错误“从不兼容的指针类型传递'update_label'的参数1”,并进一步解释它:
my04.c:5:6: note: expected ‘struct GtkLabel *’ but argument is of type ‘struct GtkWidget *’
void update_label(GtkLabel *glab)
要解决此问题,必须将lbl
向上转换为GtkLabel*
,因为该变量指向的对象实际上是一个GtkLabel
:
update_label(GTK_LABEL(lbl));
对于C语言中的GTK,您需要大量的指针转换。 出于某种原因,所有creator函数都返回
GtkWidget*
,但所有相关的修饰符函数都需要指向GtkLabel*
等的正确指针
为此,GTK提供了类型转换宏
您可以使用GTK_LABEL()
宏转换指针。
对于其他类型的小部件,您有GTK_窗口
,GTK_菜单项
以及更多类似的宏
这在一开始就有点夸张
当涉及到来自接口或父对象“类”(不是真正的OO类)的函数时,您需要选择正确的类型并进行适当的强制转换。
不会编译。
…您怎么知道?如果您询问有关生成错误的问题,请将完整的生成日志(作为文本)复制粘贴到问题主体中。然后标出错误所在的代码行,例如代码中的注释。@Jean-Françoisfare那么,你是说,如果我说,我会去,那也意味着我不想去(@Jean-Françoisfare ah..明白了,你的意思是“不会”=“不想”,对吧?可能是因为更新标签需要GtkLabel*但你提供了GtkWidget*
update_label(GTK_LABEL(lbl));