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
снова.