2016-04-09 8 views
4

次のコードスニペットの関数glade_project_get_typeの実装コードが不足していることに困惑しています。関連するヘッダファイルから宣言されたC関数はどのように実装されていませんか?

project = g_object_new (GLADE_TYPE_PROJECT, NULL); 

:.Cファイルから

#define GLADE_TYPE_PROJECT (glade_project_get_type()) 

これはglade_project_get_type()の宣言のように見える:

どこ
GType glade_project_get_type (void) G_GNUC_CONST; 

/* From glib/gmacros.h: 
    #define G_GNUC_CONST __attribute__((__const__)) 

    __attribute__((const)) function attribute 
Many functions examine only the arguments passed to them and have no effects 
except for the return value. 
If a function is known to operate only on its arguments then it can be subject 
to common sub-expression elimination and loop optimizations. 
*/ 

私は見つけることができますglade_project_get_type()の実装コードですが、ソフトウェアはエラーなしでコンパイルされます明らかに私が理解していないことがあります。

私はどこかのようなものがあることが予想される:私はCのプログラミングについて理解していないものを、そう

GType glade_project_get_type (void) 
{ 
    GType aType; 

    < some code giving a value to aType > 
    return aType 
} 

答えて

4

glade_project_get_typeを実装するコードはライブラリlibgladeuiにあります。このライブラリは別々にコンパイルされ、glade実行可能ファイルとリンクされています。

libgladeuiのソースコードは、gladeのものとともに出荷されています。関数glade_project_get_typeの定義はファイルglade-project.cにあります。

G_DEFINE_TYPE_WITH_CODE (GladeProject, glade_project, G_TYPE_OBJECT, 
         G_ADD_PRIVATE (GladeProject) 
         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, 
               glade_project_model_iface_init) 
         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE, 
               glade_project_drag_source_init)) 

このマクロは、ヘッダファイルに定義されています。関数の実際のコードは、glade_project_get_typeの次の行から来て、複雑なマクロ展開の結果であるので、あなたは、そのファイル内の文字列glade_project_get_typeを見つけることができません具体的にはgobject/gtype.hです。その拡張のある時点では、token pasting##プリプロセッサディレクティブ)がマクロ(ここではglade_project)に渡されたトークンの1つを取り、そのトークンが_get_typeで連結された関数を定義するために使用されると思います。ここで

がここで何が起こっているかの簡単な例です。一見、プログラムはmy_magic_functionの定義が含まれるように表示されませんが

#define MAKE_FUNC(name, val) int my_ ## name ## _function (void) { return val; } 

MAKE_FUNC(magic, 42) 

int main(void) { 
    printf("%d\n", my_magic_function()); 
    return 0; 
} 

、マクロMAKE_FUNCは実際にそれを作成するために拡張されます。MAKE_FUNC(magic, 42)の膨張は、単に私は空き地を推定

int my_magic_function(void) { return 42; } 
+0

多くの助けになるあなたの説明をありがとうが、私はまだ完全な理解が不足しています。私はglade-project.cの "glade_project_get_typeの次の行"を見つけましたが、glade_project_get_type()にどのように関係しているのか分かりません。私の本の中に何も書かれていないので、この仕組みを説明する本はありますか? – Roger

+0

さらに検索した後は、主な情報源はGObject Referenceマニュアルです – Roger

+0

@Roger:おそらく。私は、グレードが一般的にどのように機能するかについては何も知らないのではないかと心配しています。私はちょうどこのコードがどのようにコンパイルされるかについてのあなたの質問に対処するために探していましたが、実際にどのように使用するのかは助けません。あなたは新しい質問をしたいかもしれません。 –

2

機能glade_project_get_type()は、ライブラリにコンパイルされます。 libglade。この関数のソースコードは、hereというテンプレートから生成されるため、このライブラリの生のソースコードには正確な定義は含まれていません。

使用しているヘッダーには、利用可能な機能のみが記載されています。ヘッダーはC言語での実際のソースコードを含むことはまれであり、一般的に関数と型定義のみを含んでいます。コンパイラは、ヘッダー内の情報を使用して、関数が持つ戻り値の型と引数の型、または構造体または共用体のメンバーを知ります。使用している関数に定義があることを実際に確認するのはリンカーの仕事です。リンカーはあなたのソースコードをプリコンパイルされたlibgladeライブラリにリンクし、すべてを接続します。

+0

ある/ gladeui/gladeui-列挙-types.c.templateおよびクレード/ gladeui/gladeui-列挙-types.h.template生成するために使用されるgladeui-enum- types.cとgladeui-enum-types.hについて詳しく学びました。 gladeui-enum-types.hにはglade_pointer_mode_get_typeのような多くの_get_type関数定義が含まれていますが、glade_project_get_typeのためのものを見つけることはできません。 – Roger

関連する問題