0

すでに見出しで述べたように、修正できないように見えるコンパイル エラーが発生します。

error: redefinition of 'tinygecko_notebook_get_type'
note: previous definition of 'tinygecko_notebook_get_type' was here

エラーがこの行を指している場所(このコード スニペットの最初):

GType
tinygecko_notebook_get_type (void)
{
    static GType type = 0;
    if (type == 0) {
        static const GTypeInfo info = {
            sizeof (TinygeckoNotebookClass), /* size of class struct */
            NULL,   /* base_init */
            NULL,   /* base_finalize */
            (GClassInitFunc)tinygecko_notebook_class_init,   /* class_init */
            NULL,   /* class_finalize */
            NULL,   /* class_data */
            sizeof (TinygeckoNotebook),
            0,      /* n_preallocs */
            (GInstanceInitFunc)tinygecko_notebook_init   /* instance_init */
        };

        type = g_type_register_static (GTK_TYPE_NOTEBOOK, "TinygeckoNotebook", &info, 0);

    }
    return type;
}

ノートの行はタイプ設定を指しています

G_DEFINE_TYPE (TinygeckoNotebook, tinygecko_notebook, GTK_TYPE_NOTEBOOK);

両方のスニペットは.c ファイル内にあります (メモ行はエラー行の上にあります)。

助けていただければ幸いです..私は混乱しています。その gtk+ マクロが、独自の gobject ベースのクラス初期化子とファイナライザー (存在する場合) (この場合は GtkNotebook に基づく) 用にセットアップする必要がある関数を再定義する必要があるのはなぜですか。

4

1 に答える 1

1

G_DEFINE_TYPE は、get_type 関数の記述を避けるためのショートカットです。したがって、get_type 関数を手動で実装している場合は、G_DEFINE_TYPE を使用したくありません。

この場合、あなたの手でコード化された実装に特別なことは何もありません。通常のボイラープレートのように見えるので、おそらくそれを削除して G_DEFINE_TYPE を使用できます。

G_DEFINE_TYPE_WITH_CODE、G_DEFINE_ABSTRACT_TYPE、G_DEFINE_TYPE_EXTENDED などの G_DEFINE_TYPE のバリアントもあります。これにより、純粋なボイラープレートから少し逸脱しても、すべて手動で行うことを回避できます。

于 2011-02-24T20:46:12.450 に答える