“数组类型有不完整元素类型”是什么意思?

时间:2012-09-28 22:41:01

标签: c hashtable glib gcc4

我有以下简单的代码行:

#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

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:7)

这可能意味着GHashTable未在您包含的标头中完全定义。也就是说,glib.h或其中包含的其中一个文件中可能有一行代码如下:

typedef struct GHashTable GHashTable;

结构标签可以不同而不改变我的论点。必须有类似的东西,否则你会收到关于GHashTable未被识别为类型名称的不同消息:

error: unknown type name 'GHashTable'

<glib.h>中没有提供有关结构的额外信息;你不需要知道它来使用它。哈希表函数的API可能只处理GHashTable *值,因此您不需要知道内部的内容,只需要知道FILE *内部能够使用它的内容。在你的代码中(尽管像getchar()这样的宏函数可能需要知道FILE *的内部结构;也许更好的类比是DIR *,但这是一个POSIX接口,并不一定众所周知)。

这意味着您需要使用:

 GHashTable *htbls[3];

你可以有不完整类型的指针数组而没有问题。

答案 1 :(得分:5)

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

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

GHashTable* htbls[3];

答案 2 :(得分:5)

问:GHibTable是否在glib.h中完全指定?

答:没有。

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

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

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