Обновление 2 года спустя:
Каждый глобальный объект, доступный более чем одному исходному файлу, должен быть заключен в функцию inline
, чтобы компоновщик разделял объект между файлами, иПрограмма инициализирует его правильно.
inline std::string const &const1() {
static std::string ret = "hello, world!";
return ret;
}
Функция inline
неявно extern
и может быть обернута в именованное пространство имен или класс, если хотите.(Но не используйте класс только для хранения статических членов, так как для этого лучше использовать пространства имен. И не используйте анонимное пространство имен, так как это повредит компоновщику, и каждый источник увидит свой объект std::string
.)