Глобальный массив в заголовке C? - PullRequest
4 голосов
/ 25 августа 2010

Хорошо, странное время вопроса!

Я рефакторинг некоторого старого кода C ++, который объявляет кучу массивов, например, так:

static SomeStruct SomeStructArray[] = {
    {1, 2, 3},
    {4, 5, 6},
    {NULL, 0, 0}
}

И так далее. Они разбросаны по исходным файлам и используются там, где они объявлены.

Однако я хотел бы переместить их в один исходный файл (в основном потому, что я придумал способ их автоматической генерации). И, конечно, я наивно пытаюсь сделать для них заголовок:

static SomeStruct SomeStructArray[];

На самом деле, даже я знаю, что это неправильно, но в любом случае вот ошибка компилятора:

error C2133: 'SomeStructArray' : unknown size    arrays.h
error C2086: 'SomeStruct SomeStructArray[]' : redefinition    arrays.cpp

Итак, я думаю, как правильно это сделать?

Ответы [ 3 ]

8 голосов
/ 25 августа 2010

Если вы собираетесь поместить все массивы в один файл (и, по-видимому, получить к ним доступ из других файлов), вам нужно удалить static из определений (что делает их видимыми только внутрита же единица перевода (т. е. файл)).

Затем в заголовке необходимо добавить extern к каждому объявлению.

Наконец, конечно, вам нужноубедитесь, что при наличии массива SomeStruct (например) определение SomeStruct является видимым, прежде чем пытаться определить их массив.

0 голосов
/ 25 августа 2010

Создайте файл заголовка и поместите его в него:

extern SomeStruct SomeStructArray[];

, затем поместите существующий код в исходный файл (не файл заголовка):

SomeStruct SomeStructArray[] = {
    {1, 2, 3},
    {4, 5, 6},
    {NULL, 0, 0}
}

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

size_t size = sizeof SomeStructArray; // doesn't work in any source file apart
                                      // from the one defining the array.

Вы можете добавить дополнительные переменные, чтобы обойти это.

Это было протестировано с использованием DevStudio2k5.

0 голосов
/ 25 августа 2010

Попробуйте использовать

.h файл:

extern SomeStruct SomeStructArray[];

.cpp файл:

extern SomeStruct SomeStructArray[] = {
  {1, 2, 3},
  {4, 5, 6},
  {NULL, 0, 0}
}
...