1

次の簡単なコード行があります。

#include <glib.h>
#include <stdio.h>

void my_func () {
    GHashTable htbls[3]; /* ASSUME LINE NUMBER IS N */
    /* Do something */
}

int main (int argc, char *argv[]) {
    my_func ();
    return 0;
}

しかし

$gcc `pkg-config --cflags --libs glib-2.0` ./main.c

次のエラーが発生します。

./main.c:N: error: array type has incomplete element type

要素の型が不完全な理由がわかりません。 GHashTableで完全に指定されていglib.hます。

よろしくお願いします。

4

3 に答える 3

7

おそらくGHashTable、含めるヘッダーで が完全に定義されていないことを意味します。つまり、glib.h次のような行が含まれている可能性があります。

typedef struct GHashTable GHashTable;

引数を変更しなくても、構造タグは異なる可能性があります。GHashTableそうしないと、型名として認識されないという別のメッセージが表示されるため、似たようなものがあるはずです。

error: unknown type name 'GHashTable'

の構造に関する追加情報は提供されていません<glib.h>。使用するためにそれを知る必要はありません。ハッシュ テーブル関数の API はおそらく値のみを処理するため、コードで使用できるようにするためにGHashTable *a の内容を知る必要があるのと同様に、内部の内容を知る必要はありません(ただし、 のようなマクロ化された関数はの内部について知る必要があります。より適切なアナロジーは かもしれませんが、これは POSIX インターフェイスであり、必ずしもよく知られているわけではありません)。FILE *getchar()FILE *DIR *

これは、次を使用する必要があることを意味します。

 GHashTable *htbls[3];

問題なく不完全な型へのポインタの配列を持つことができます。

于 2012-09-28T22:46:35.160 に答える
5

Q: GHashTable は glib.h で完全に指定されていませんか?

A:いいえ。

ハッシュテーブルが必要な場合は、g_hash_table_new()、g_hash_table_add () およびその仲間を使用する必要があります。

つまり、「struct _GHashTable」はアプリケーションに対して不透明です。

本当に GHashTables の配列が必要な場合は、"GHashTable *" の配列が必要になります。また、配列の各要素を独自の新しいハッシュ テーブルで明示的に初期化する必要があります。

于 2012-09-28T22:48:41.023 に答える
5

よろしいですか?glib.h から仕様をコピーして貼り付けます。(私の glib.h には GHashTable の定義が含まれていません)。

値ではなくポインタを使用する必要があります。

GHashTable* htbls[3];
于 2012-09-28T22:45:20.500 に答える