C和GTK通过参数

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

以下程序将不会编译。我将代码简化为这个简单的程序。我已经发布了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_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));