Обратите внимание, что foo
- это не класс, а пространство имен. Когда вы объявляете свободную переменную в заголовочном файле:
int bar;
И затем #include этот заголовочный файл несколько раз (в разных файлах CPP, вызывая несколько компиляций модуля перевода), вы получите ошибку компоновщика. Все это знают.
И вы добавите атрибут extern
в объявление, а определите переменную в другом месте в одном из файлов CPP / C.
Помещение глобальной переменной в пространство имен - это не что иное, как присвоение переменной global другого имени. Подумайте, если foo::bar
как foo__NS__bar
, и, следовательно, вы должны добавить extern
в заголовок и определить foo::bar
в некотором местоположении.
Обратите внимание, что это отличается от нестатической переменной-члена класса. Переменная класса не должна быть определена / объявлена таким образом, поскольку класс является типом . Каждая экземплярная переменная класса-типа будет иметь отдельную копию переменной.
Кроме того, когда вы добавляете переменную static
в класс, вы даете этой переменной логически global другое имя. Следовательно, у вас должна быть эта статическая переменная , определенная , в одном из файлов CPP.