當實踐上GTK +教程我曾經遇到過的示例代碼,看起來像這樣告訴類型轉換做類型轉換。顯然gtk_misc_set_alignment()是一個函數,但是如何判斷是否 GTK_MISC(label)是一個函數或類型轉換?如何從功能
對不起,小白的問題,我是一個小白程序員,提前
當實踐上GTK +教程我曾經遇到過的示例代碼,看起來像這樣告訴類型轉換做類型轉換。顯然gtk_misc_set_alignment()是一個函數,但是如何判斷是否 GTK_MISC(label)是一個函數或類型轉換?如何從功能
對不起,小白的問題,我是一個小白程序員,提前
實際上,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
的概念。
感謝類型轉換與類型來完成的括號內
(type) object // typecast
identifier (argument) // function call
我看到,我沒有意識到類型(對象)在C中無效謝謝你的快速響應 – MrDetail 2012-03-01 16:35:03
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編碼標準。
您還應該閱讀文檔:http://developer.gnome.org/gtk3/3.2/GtkMisc.html – Gandaro 2012-03-01 16:30:43