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 里面有什么FILE *才能在你的代码中使用它一样(尽管宏化函数比如getchar()可能需要了解 的内部结构FILE *;也许更好的类比是DIR *,但这是一个 POSIX 接口,不一定众所周知)。

这意味着您将需要使用:

 GHashTable *htbls[3];

您可以毫无问题地拥有指向不完整类型的指针数组。

于 2012-09-28T22:46:35.160 回答
5

你确定吗?从 glib.h 复制/粘贴规范。(我的 glib.h 不包含 GHashTable 的定义)。

您需要使用指针,而不是值:

GHashTable* htbls[3];
于 2012-09-28T22:45:20.500 回答
5

Q: GHashTable 不是完全在 glib.h 中指定的吗?

答:没有。

如果你想要一个哈希表,你应该使用 g_hash_table_new()、g_hash_table_add() 和朋友:

换句话说,“struct _GHashTable”对您的应用程序是不透明的。

如果你真的想要一个 GHashTables 数组,那么你需要一个“GHashTable *”数组。而且您需要使用自己的新哈希表显式初始化数组的每个元素。

于 2012-09-28T22:48:41.023 回答