какую пользу можно извлечь из подобной конструкции:
namespace{
int i;
}
какую пользу можно извлечь из подобной конструкции:
namespace{
int i;
}
Польза та же, что и при использовании ключевого слова static — избегание проблем с ODR (one definition rule). Если, к примеру, в заголовке у Вас будет int i;, тогда при подключении в 2 и более .cpp файла Вы получите ошибку линковки — один и тот же символ определён дважды. Если же Вы напишете static int i;, то i станет локальным для каждого объектного файла, в который i попадает — т.е. в каждом cpp будет свой i, в отличии от первого варианта, где i один на всю программу. То же самое происходит когда Вы пишите
namespace{
int i;
}
i получает внутреннее связывание и, следовательно, проблемы с ODR не будет.
unique (см.7.3.1.1). По поводу как достучаться и т.д. задал вопрос на английском SO.
– αλεχολυτ
Feb 09 '16 at 09:59
Для каждого безымянного пространства имён компилятор генерирует уникальное имя, которое отличается от любого другого имени в программе.
namespace __Unique_Name__ {
int i;
}
using namespace __Unique_Name__;
Особенно полезным свойством безымянных пространств является то, что их можно объявлять внутри других пространств имён, например, именованных.