Внешнее разделение для массива?
У меня есть массив, определенный в файле, а в другом я должен его использовать, например,
/* a.c - defines an array */
int a[] = {1,2,3,4,5,6,7,8,9};
/* b.c - declare and use it. */
#define COUNT ((sizeof a)/(sizeof int))
extern int a[]; //size of array
.
.
.
int i;
for(i=0; i<COUNT; i++)
printf("%d", a[i]);
.
.
.
Теперь, когда я пытаюсь скомпилировать его, он дал мне ошибку, говоря, что sizeof cann't не используется для неполного типа.
Может ли кто-нибудь сказать мне, как обрабатывать такой случай в C/С++? Я не хочу индексировать массив в a.c
Заранее спасибо
Ответы
Ответ 1
В a.c
вы можете поместить что-то вроде следующего, а затем вывести его из b.c
.
В a.c:
int a[] = {1, 2, 3};
const int lengthofa = sizeof( a ) / sizeof( a[0] );
И затем в b.c:
extern int a[];
// the extern (thanks Tim Post) declaration means the actual storage is in another
// module and fixed up at link time. The const (thanks Jens Gustedt) prevents it
// from being modified at runtime (and thus rendering it incorrect).
extern const int lengthofa;
void somefunc() {
int i;
for ( i = 0; i < lengthofa; i++ )
printf( "%d\n", a[i] );
}
Ответ 2
Если вы хотите, чтобы размер вашего массива был доступен как константа времени компиляции, у вас нет другого выбора, кроме как указать размер массива явно в объявлении extern
массива
extern int a[9];
В этом случае вы должны быть уверены, что размер массива согласован между объявлением и определением extern
. Вы можете использовать для этого константу манифеста, но все же вы будете нести ответственность за то, чтобы количество инициализаторов между {}
и объявленным размером совпало.
Если вы не хотите иметь размер массива как константу времени компиляции, то вы можете сделать то, что предлагает Марк Уилкинс в своем ответе.
Ответ 3
У компилятора недостаточно информации при компиляции b.c для определения размера массива. Эта информация находится только в a.c, где ваш список инициализаторов находится в области.
Вам нужно каким-то образом сообщить размер. Один из методов заключается в том, чтобы определить int const с размером и внешним элементом. Другая возможность - использовать дозорный (значение вне допустимого диапазона данных), чтобы указать конец массива.
Ответ 4
на мой взгляд, если у вас нет определения и определить с sizeof a в одном файле, он не компилируется.
Файлы компилируются и сохраняются как *.obj/*.a файлы. Вы можете использовать массивы из других файлов, благодаря декларации extern, которая будет проверять процесс связывания после компиляции.
Вы хотите объявить define (preproceror должен помочь здесь с этим. Он запускается перед компилятором).
поэтому перед компиляцией вы не получите массив из другого файла...
Ответ 5
Я бы #define ARRAY_MAX (or whatever)
во внешнем заголовке, обычно используемом для определения таких вещей, а затем включил этот заголовок в оба файла, которые ему нужны. Это хорошо работает, когда вы обычно сохраняете большинство, если не все ваши define
, в одном или двух центральных заголовках.