Что означает "тип массива имеет неполный тип элемента"?

У меня есть следующие простые строки кода:

#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 *". И вам нужно будет явно инициализировать каждый элемент вашего массива своей собственной новой хэш-таблицей.

Другие вопросы по тегам