2012-03-01 11 views
4

から型キャストを伝えるために:著者のすべてのコードが機能して(間にスペースを持っているどのようにGTK +のチュートリアルを練習している間、私はこのようになりますサンプルコードに遭遇している機能

gtk_misc_set_alignment (GTK_MISC (label), 0, 0); 

を)が、そう型変換を行います。 明らかにgtk_misc_set_alignment()は関数ですが、 GTK_MISC(label)が関数か型変換であるかどうかをどのようにして知ることができますか?

のnoobの質問には申し訳ありませんが、私はnoobのプログラマーだ、事前

+0

また、ドキュメントを読む必要があります:http://developer.gnome.org/gtk3/3.2/GtkMisc.html – Gandaro

答えて

9

実際には、GTK_MISCは「古典的な」Cタイプキャストを隠すマクロです。それはおそらくのようなものです:

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

あなたは代わりに、単純に書くことができる:

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

をGTKには、このようなマクロを提供し、正確に、なぜ私は知らない、おそらく彼らは、「関数のように」「エミュレート」が好きC++が提供するキャスト


編集

[OK]を、多分私はそれを得ました。私は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

で 感謝を型キャストがC type(value)でカッコ

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

私は、そのタイプ(オブジェクト)がC言語では有効ではなかったことを認識していませんでした。速い応答 – MrDetail

4

内部のタイプで行われているが、有効なキャストではありません。これはC++の構文です。

+0

私はそれを知らなかった、ありがとう – MrDetail

+1

GTKでは、これらの種類のキャストはマクロであるので、それらはそのように見える。 – ptomato

0

GLib'sなので、GTKの型システムはCの型システムとは少し異なります。 GLibはC言語で開発されているため、C++やC#やJavaのような実際のクラスを持つことはできません。だから彼らは何とかそれをエミュレートする必要があります。各オブジェクトは実際には構造体(この場合はstruct _GtkMisc)であり、型(クラス)が登録されたときに初期化されるクラスフィールドを持ちます。型キャストマクロはこのフィールド値をチェックし、 "オブジェクト"が要求された型(この場合はGtkMiscから継承されている)から継承されていれば、それはその型キャストされています。そうでない場合、それはあなたにエラーが吠えます、あなたがわからないので、もし、あなたが質問の第二部について

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

のように、GTK_IS _ *()マクロでそれを確認することができ、中括弧の前にスペースがの一部でありますGnomeチームのコーディング標準は、私が知る限り、GNUコーディング標準から派生しています。

関連する問題