2012-03-01 61 views
4

當實踐上GTK +教程我曾經遇到過的示例代碼,看起來像這樣告訴類型轉換做類型轉換。顯然gtk_misc_set_alignment()是一個函數,但是如何判斷是否 GTK_MISC(label)是一個函數或類型轉換?如何從功能

對不起,小白的問題,我是一個小白程序員,提前

+0

您還應該閱讀文檔:http://developer.gnome.org/gtk3/3.2/GtkMisc.html – Gandaro 2012-03-01 16:30:43

回答

9

實際上,GTK_MISC是隱藏「經典」C類型轉換的宏。這可能是這樣的:

#define GTK_MISC(p) ((GtkMisc *)(p)) 

你可以不是簡單地寫:

gtk_misc_set_alignment ((GtkMisc *) label, 0, 0); 

我不知道爲什麼GTK提供了這樣的宏,也許他們想「效仿」的「功能類」強制C++提供。


編輯

好吧,也許我得到了它。我沒有找到一個特定的文檔GTK_MISC,但它似乎是完全一樣的東西G_OBJECT,它說:

#define G_OBJECT(object)   (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject)) 

蒙上了GObject或派生的指針爲(GObject*)指針。根據當前的調試級別,該函數可能會調用特定的運行時檢查來識別無效的強制轉換。

所以,大概也GTK_MISC執行上的指針一些運行時檢查,以檢查其是否可以實際澆鑄爲GtkMisk *。你可以說這是C++中的dynamic_cast的概念。

5

感謝類型轉換與類型來完成的括號內

(type) object   // typecast 
identifier (argument) // function call 
+0

我看到,我沒有意識到類型(對象)在C中無效謝謝你的快速響應 – MrDetail 2012-03-01 16:35:03

4

在C type(value)不是有效的轉換。這是C++語法。

+0

我不知道,謝謝 – MrDetail 2012-03-01 16:36:02

+1

在GTK中,這些類型是宏,所以它們看起來像這樣。 – ptomato 2012-03-01 23:25:56

0

GLib的,所以GTK的類型系統與C的類型系統有點不同。 GLib是用C開發的,因此它不能像C++,C#或Java那樣擁有真正的類。所以他們必須以某種方式效仿它。每個對象實際上都是一個結構體(在本例中是一個struct _GtkMisc),它具有一個類字段,當類型(類)被註冊時它會被初始化。類型鑄造宏檢查這個字段的值,如果「對象」是從請求類型(在這種情況下,來自GtkMisc)繼承,那麼它就是「類型化」的。如果不是,它會吠叫你一個錯誤,所以如果你不確定,你可以用GTK_IS檢查_ *()宏,就像

if (GTK_IS_MISC(label)) 
    gtk_misc_set_alignment(label); 

關於這個問題的第二部分,括號前的空間是部分Gnome團隊的編碼標準,據我所知,其編碼標準來源於GNU編碼標準。