" У меня есть 4 файла ".
Позволь мне остановить тебя прямо там. Я согласен, что у вас есть четыре файла, но это не совсем актуально. У вас есть две единицы перевода . Единица перевода - это квант текста, который подается в ваш компилятор. Ваши единицы перевода, назовем их MAIN и SOMETHING , состоят из результата предварительной обработки ваших файлов main.cpp
и something.cpp
соответственно.
После предварительной обработки каждая из ваших единиц перевода включает в себя строку int *sth;
Эта строка объявляет и определяет переменную sth
.
Правило единого определения требует, чтобы во всей вашей программе было ровно одно (не больше, не меньше) определение sth
. Для этого у вас должна быть ровно одна строка исходного кода int *sth;
ровно в одной единице перевода и столько extern int *sth;
, сколько вам требуется.
В вашем случае я бы поставил int *sth;
в MAIN и extern int *sth;
в ЧТО-ТО. Кроме того, вы можете иметь столько дополнительных копий extern int *sth;
, сколько захотите - они ничего не повредят.
Теперь вернемся к вашим четырем файлам. Вы должны положить extern int *sth;
в shared.h
. Это означает, что MAIN и SOMETHING будут иметь строку extern
. Вам также следует ввести int *sth;
в main.cpp
, чтобы в MAIN было определение.
И вот вы: MAIN и SOMETHING имеют extern
строки, поэтому они оба ссылаются на одну и ту же переменную. ГЛАВНАЯ также имеет определение. таким образом, переменная sth
имеет ровно одну из них.
<ч />
В сторону : Почему static int *sth;
in shared.h
делает неправильные вещи?
Поскольку каждая из двух единиц перевода видит свою собственную декларацию static
. Объявление static
уменьшает связь объявленного имени с этой единственной единицей перевода.