2017-04-05 50 views
0

以下程序不會編譯。我已經將代碼縮減爲這個簡單的程序。我已經發布了編譯命令及其輸出。C和GTK通過參數

#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; 
} 

編譯器的輸出是:

[email protected] ~/c/label $ gcc `pkg-config --cflags gtk+-3.0` my04.c -o my04 `pkg-config --libs gtk+-3.0` 
my04.c: In function ‘main’: 
my04.c:17:3: warning: passing argument 1 of ‘update_label’ from incompatible pointer type [enabled by default] 
    update_label(lbl); 
^
my04.c:5:6: note: expected ‘struct GtkLabel *’ but argument is of type ‘struct GtkWidget *’ 
void update_label(GtkLabel *glab) 
    ^
+1

'不會編譯... ...你怎麼知道? –

+1

如果您提出有關構建錯誤的問題,請將完整構建日誌(作爲文本)複製粘貼到問題的正文中。然後標出哪些錯誤代碼行,例如代碼中的註釋。 –

+0

@ Jean-FrançoisFabre所以,你說,如果我說,我會去,這也意味着我不想去? :( –

回答

0

您聲明update_label作爲接受GtkLabel*參數:

void update_label(GtkLabel *glab); 

在另一方面,你通過它的參數lbl這是GtkWidget*類型:

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) 

爲了解決這個問題,必須上溯造型lblGtkLabel*,作爲變量指向對象,它是一個真正的GtkLabel

update_label(GTK_LABEL(lbl)); 

https://developer.gnome.org/gobject/stable/gtype-conventions.html

0

對於C語言中的GTK,你需要很多指針轉換。 出於某種原因,所有創作者的函數返回GtkWidget*但所有相關的修改功能需要正確的指針GtkLabel*等。

爲此,GTK提供了類型轉換宏。

您可以使用GTK_LABEL()宏來轉換您的指針。 對於其他類型的小部件,您有GTK_WINDOW,GTK_MENU_ITEM以及更多這樣的宏。

這首先是相當複雜的。

當涉及到從一個接口或父對象「類」(不是真正的OO類)的功能,你需要選擇正確的類型,並適當地轉換。