В C ++ глобальные переменные (объявленные вне любого класса) по умолчанию имеют внешнюю связь. То есть они видны другим модулям, когда приложение связано.
Таким образом, оба файла. cpp предоставляют переменную i
для компоновщика, который возражает.
Четыре решения:
1) Поместите одно или оба объявления в другое пространство имен:
namespace Wibble
{
int i = 2;
}
, чтобы они имели разные полностью квалифицированные имена.
2) Объявите одно или оба как static
:
static int i = 2;
, который отключает внешнюю связь.
3) Поместите одно или оба в анонимное пространство имен:
namespace
{
int i = 2;
}
, которое автоматически назначает уникальное пространство имен каждому - фактически тот же результат, что и (2)
4) Объявить все, кроме одного, как extern
без инициализации:
extern int i;
это говорит о том, что переменная i
фактически та же самая переменная, что и в другом файле, который не был объявлен как extern
.