Как правильно написать объявления внешних массивов (и двойных массивов) в заголовочных файлах C? - PullRequest
8 голосов
/ 06 августа 2010

Предположим, я хочу поделиться глобальным массивом данных в моей программе, например:

int lookup_indexes[] = { -1, 1, 1, -1, 2, 1, 1, -2, 2, 2, -1, 1, 1, 2 };

Какое правильное объявление extern для этого массива в заголовочном файле C?

А как насчет массива, подобного этому:

int double_indexes[][5] = { { -1, 1, 1, -1, 1 }, { 2, -2, 2, 1, -1 } };

В моем заголовочном файле я пробовал это:

extern int lookup_indexes[];
extern int double_indexes[][5];

Но это приводит к ошибкам компилятора:

water.h:5: error: array type has incomplete element type

Я не могу понять.

Спасибо, Бода Кидо.

Ответы [ 2 ]

6 голосов
/ 06 августа 2010

Эта ссылка обсуждает проблемы с массивами и размерами, используемыми как extern, и способы их управления.

  1. Объявить переменную-компаньон, содержащую размер массива, определенный и инициализированный (с sizeof) в том же исходном файле, где определен массив
  2. определить константу манифеста для размера, чтобы ее можно было последовательно использовать в определении и внешнем объявлении

  3. Использовать некоторое значение часового типа (обычно 0, -1 или NULL) в последнем элементе массива, чтобы код мог определить конец без явного указания размера
2 голосов
/ 06 августа 2010

Код, который вы разместили, выглядит хорошо для меня и компилируется (gcc -std=c99 -pedantic и gcc -std=c90 -pedantic) на моей машине.Вы скопировали эти строки или сделали опечатку в своем реальном заголовке?

Пример опечаток, которые могут вызвать вашу ошибку (чистая догадка):

extern int double_indexes[][];  /* forgot the 5 */
extern int double_indexes[5][]; /* [] and [5] swapped */
...