Вінсенс Роберт правий у своєму коментарі Як правильно ви користуєтесь просторами імен у C ++? .
Використання простору імен
Простори імен використовуються як мінімум, щоб уникнути зіткнення імен. У Java це застосовується за допомогою ідіоми "org.domain" (оскільки, як передбачається, ніхто не буде використовувати нічого іншого, крім власного доменного імені).
У C ++ ви можете надати простір імен усьому коду вашого модуля. Наприклад, для модуля MyModule.dll ви можете дати його коду простору імен MyModule. Я десь бачив когось, хто використовує MyCompany :: MyProject :: MyModule. Я думаю, що це надмірно, але в цілому мені це здається правильним.
Використання "використання"
Використовувати слід дуже обережно, оскільки він ефективно імпортує один (або всі) символи з простору імен у поточну область імен.
Це зло це робити у файлі заголовка, тому що ваш заголовок забруднює кожне джерело, включаючи його (це нагадує мені про макроси ...), і навіть у вихідному файлі, поганий стиль поза рамками функції, оскільки він імпортуватиметься в глобальному масштабі символи з простору імен.
Найбільш безпечний спосіб використання "використання" - імпорт вибраних символів:
void doSomething()
{
using std::string ; // string is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
std::cout << a << std::endl ;
}
void doSomethingElse()
{
using namespace std ; // everything from std is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
cout << a << endl ;
}
Ви побачите багато "використання простору імен std;" в кодах підручника чи прикладу. Причина - зменшити кількість символів, щоб полегшити читання, а не тому, що це гарна ідея.
"використання простору імен std;" відлякує Скотта Майєрса (я не пам'ятаю точно, яку книгу, але я можу знайти її в разі потреби).
Склад простору імен
Простору імен більше, ніж пакетів. Інший приклад можна знайти в книзі Bjarne Stroustrup "Мова програмування C ++".
У "Спеціальному виданні", в 8.2.8 Композиція простору імен , він описує, як можна об'єднати два простори імен AAA і BBB в інший під назвою CCC. Таким чином, CCC стає псевдонімом як для AAA, так і для BBB:
namespace AAA
{
void doSomething() ;
}
namespace BBB
{
void doSomethingElse() ;
}
namespace CCC
{
using namespace AAA ;
using namespace BBB ;
}
void doSomethingAgain()
{
CCC::doSomething() ;
CCC::doSomethingElse() ;
}
Ви навіть можете імпортувати вибрані символи з різних просторів імен, щоб створити власний інтерфейс простору імен. Мені ще потрібно знайти практичне використання цього, але теоретично це круто.
std
простору імен до символів, а не до використанняusing
взагалі. Тому я завжди пишуstd::cout
абоstd::string
зараз, тому що я зараз їх називаю. Я б ніколи просто не писавcout
.