extern const в этой конкретной ситуации

Есть другие вопросы по использованию extern а также const в C++. Я также читал о внутренних и внешних связях (это было давно, так как я использовал C++), но я был бы признателен, если бы кто-то напомнил мне об использовании следующей конкретной ситуации.

У меня два cpp файлы: Description.cpp и Register.cpp и один hpp описание файла. ч. Это что-то вроде этого

//Description.cpp
#include "Description.hpp"
extern const FD models[];
//some other code

,

//Register.cpp
#include "Description.hpp"
extern const FD models[2]={
                           {"elementA",{1,2}},
                           {"elementB",{3,4}}
                          };

,

//Description.hpp
struct FD{
  string name;
  double v[2];
};

Мне интересно, почему ключевое слово extern необходимо в Register.cpp

1 ответ

Как обсуждалось в комментариях, по умолчанию const объект имеет внутреннюю связь, то есть вы можете видеть его только из файла, в котором вы его определили. Чтобы изменить это, вы используете ключевое слово extern, что означает "эту переменную можно увидеть из других файлов". Поэтому в Register.cpp, тебе нужно extern сказать компоновщику, чтобы сделать это видимым в другом месте, и в Description.cpp тебе нужно extern сказать компилятору, что это может быть определено в другом месте.

Лучшим решением было бы перенести декларацию extern const FD models[]; в .hpp файл (либо Description.hpp или новый Register.hppв зависимости от деталей вашего проекта). Затем в Description.cpp и любой другой код, который использует models, вы включаете этот файл и вообще не нуждаетесь в объявлении. В Register.cppВы также включаете этот заголовок. Тогда компилятор знает, что models имеет внешнюю связь, и вам не нужно говорить extern снова.

Другие вопросы по тегам