Что означает "тип массива имеет неполный тип элемента"?
У меня есть следующие простые строки кода:
#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 ответа
Предположительно это означает, что 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];
Вы можете иметь массивы указателей на неполные типы без проблем.
Вы уверены, что? Скопируйте / вставьте спецификацию из glib.h. (Мой glib.h не содержит определения для GHashTable).
Вам нужно использовать указатель, а не значение:
GHashTable* htbls[3];
Q: Разве GHashTable полностью не указан в glib.h?
A: Нет.
Если вам нужна хеш-таблица, вы должны использовать g_hash_table_new(), g_hash_table_add () и друзей:
Другими словами, "struct _GHashTable" непрозрачна для вашего приложения.
Если вам действительно нужен массив GHashTables, тогда вам понадобится массив "GHashTable *". И вам нужно будет явно инициализировать каждый элемент вашего массива своей собственной новой хэш-таблицей.