2010-08-06 1 views
8

Предположим, я хочу поделиться глобальный массив данных по моей программе, например:Как правильно писать объявления массивов extern (и двойных массивов) в заголовочных файлах C?

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 

я могу Не понимаю.

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

+0

Можете ли вы опубликовать содержимое 'water.h' по крайней мере, до линии 5 и показать, какая линия вызывает ошибку. –

+0

Charles, это #ifndef, #define, newline и 'extern int lookup_indexes [];' (4-я строка) и 'extern int double_indexes [] [5];' (5-я строка). – bodacydo

+0

он хотел поставить вопрос в свой вопрос. Просто добавьте его. – detly

ответ

6

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

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

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

+1 для упоминания размера массива. Компилятор просто не имеет информации о размере массива, если он явно не объявлен в заголовочном файле – chrmue

+0

Я не верю, что это проблема или вопрос OP: он не хочет знать размер своих массивов, он просто хочет их правильно объявить. Ссылки C-FAQ всегда хороши, конечно. – schot

2

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

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

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

Спасибо, позвольте мне проверить. – bodacydo

Смежные вопросы