我有以下简单的代码行:
#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
。
提前感谢您的帮助。
答案 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 *”数组。并且您需要使用自己的新哈希表显式初始化数组的每个元素。