определение внешнего массива - PullRequest
4 голосов
/ 23 августа 2011

Я хотел бы определить массив строк в другом файле cpp, но, кажется, есть некоторое расхождение между определением и объявлением, когда я пытаюсь сделать указатель (элемент массива) также постоянным. Использование того же определения, что и для декларации, работает нормально, поэтому я подозреваю, что инициализация не является проблемой. В приведенном ниже коде я закомментировал нарушающее const - поэтому он будет компилироваться, но если const не закомментирован, компоновщик (протестированный с g ++ 4.6 и VS10) не найдет ext_string_array.

main.cpp:

#include <iostream>

const char* const string_array[2] =
{
  "aaa",
  "bbb"
};

extern const char* /*const*/ ext_string_array[2]; // <- offending const

int main()
{
  std::cout << string_array[0];
  std::cout << ext_string_array[0];
}

definition.cpp:

const char* /*const*/ ext_string_array[2] = // <- offending const
{
  "aaa",
  "bbb"
};

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

В этом контексте const также означает static, если вы не укажете extern. Измените свой файл .cpp на этот

extern const char* const ext_string_array[2] =
{
  "aaa",
  "bbb"
};
1 голос
/ 23 августа 2011

C ++ 2003, 3.5 Программа и связь , 3 :

Имя, имеющее область имен (3.3.5), имеет внутреннюю связь, если оноимя [...]

- объект или ссылка, которые явно объявлены как const и ни явно не объявлены как extern, так и ранее не объявлены как имеющие внешнюю связь;[...]

Так что вам нужно явное extern в объявлении ..

...