Внешний Delaration для массива?

Вместо выполнения

lastLevel [nesting [i]] = new JValue(prop.GetValue (value));

Вы должны выполнить

lastLevel[nesting[i]] = JValue.FromObject(jValue);

В противном случае у нас есть

Не удалось определить тип объекта JSON для типа ...

Исключение

24
задан AnT 18 June 2010 в 17:44
поделиться

6 ответов

Вы можете поместить что-то вроде следующего в 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] );
}
25
ответ дан 28 November 2019 в 23:30
поделиться

Если вы хотите, чтобы размер вашего массива был доступен как константа времени компиляции, то у вас нет другого выбора, кроме как явно указать размер массива в объявлении extern массива

extern int a[9];

В в этом случае ваша ответственность состоит в том, чтобы убедиться, что размер массива согласован между объявлением и определением extern. Вы можете использовать константу манифеста для этого, но все же вы будете обязаны убедиться, что число инициализаторов между {} и объявленным размером одинаково.

Если вы не хотите, чтобы размер массива был константой времени компиляции, вы можете сделать то, что предлагает Марк Уилкинс в своем ответе.

16
ответ дан AnT 28 November 2019 в 23:30
поделиться

Я хотел бы #define ARRAY_MAX (or whatever) во внешнем заголовке, обычно используемом для определения таких вещей, затем включить этот заголовок в оба файла, которые в нем нуждаются. Это хорошо работает, когда вы склонны хранить большинство, если не все ваши define в одном или двух центральных заголовках.

1
ответ дан Engineer 28 November 2019 в 23:30
поделиться

Поместите переменную в заголовочный файл только так:

#ifndef A_DEF
#define A_DEF
int a[] = {1,2,3,4,5,6,7,8,9}; 
#endif

Условная компиляция не позволит переопределить переменную. Таким образом, у вас есть доступ к нему из любого места.

0
ответ дан Hairi 28 November 2019 в 23:30
поделиться

При компиляции b.c компилятору не хватает информации для определения размера массива. Эта информация находится только в a.c, где находится ваш список инициализаторов.

Вам нужно как-то сообщить размер. Один из способов - определить int const с размером и extern. Другой вариант - использовать дозорный (значение за пределами допустимого диапазона данных) для обозначения конца массива.

1
ответ дан 28 November 2019 в 23:30
поделиться

на мой взгляд, если у вас нет определения и определения с sizeof a в одном файле, он не компилируется.

Файлы компилируются и сохраняются как файлы * .obj / * .a. Вы можете использовать массивы из других файлов благодаря объявлению extern, которое будет проверяться в процессе компоновки после компиляции.

Вы хотите объявить определение (здесь должен помочь препроцессор. Он запускается перед компилятором).

поэтому перед компиляцией вы не получите массив из другого файла ...

0
ответ дан 28 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: