Подтвердить что ты не робот

Внешнее разделение для массива?

У меня есть массив, определенный в файле, а в другом я должен его использовать, например,

/* 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

Заранее спасибо

4b9b3361

Ответ 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, в одном или двух центральных заголовках.