Если в разных единицах трансляции объявлено одно и то же пространство имен, то оно «склеивается» в единое пространство:
namespace RSDN {
void fl(void) {...}; int x:
void f2(void) {...}; int y; class A{};
Не используйте глобальную директиву using в заголовочных файлах.
Именно таким образом «склеивается» стандартное пространство std, которое можно наблюдать в системных заголовочных файлах, размещенных в каталоге include интегрированной среды.
Это свойство «склеивания» пространства имен можно использовать для организации библиотеки. Аналогично классам, мы разобьем исходный код на две части: интерфейс и реализацию. Интерфейсную часть поместим в отдельный h-файл, указав в нем только объявления, например:
// matrix, h
namespace matrix {
class matrix {/*...*/};
const double pi = 3.141615926;
matrix operator+(const matrix &ml, const matrix &m2); void transposition(matrix &);
}
В файл matrix.cpp поместим реализацию:
// matrix.cpp
#include "matrix.h" namespace matrix {
matrix operator+(const matrix &ml, const matrix &m2)
{ /• ... */ }
void transposition(matrix &m)
{ /* ... */ } // реализация методов класса matrix... }
Тогда в клиентском коде можно будет подключать только заголовок:
// user.срр
#include "matrix.h" //...
void f(matrix::matrix &m) { //...
matrix::transposition(m);
//. . .
}
Как видно, такая организация пространства имен совершенно аналогична разделению класса на интерфейс и реализацию.
Пространства имен могут быть вложенными. В стандарте (см. п. п. 7.3/5 в [1]) приведен такой пример:
namespace Outer { // внешнее пространство имен
int i;
namespace Inner { // вложенное пространство имен
void f() { } // работает Outer::i
int i;
void g() { i++; } // работает Inner::i;
}
}
Естественно, для обращения к именам из вложенного пространства нужно писать двойной префикс-квалификатор, например:
Outer::Inner::g();
Синонимы можно назначать и для вложенных пространств. Например, в справочной системе интегрированной среды Borland С++ Builder 6 приведен такой пример:
namespace B0RLAND_S0FTWARE_C0RP0RATI0N { // внешнее
/* тело пространства имен */
namespace NESTED_BORLAND_SOFTWARE_CORPORATION { // вложенное /* тело пространства имен */ }
}
// синонимы пространства имен // внешнее пространство
namespace Bl = B0RLAND_S0FTWARE_C0RP0RATI0N;
// внутреннее пространство задается с квалификатором
namespace NBI =
B0RLAND_S0FTWARE_C0RP0RATI0N::NESTED_BORLAND_SOFTWARE_CORPORATION;
Как видим, при определении синонима внутреннего пространства имен указыва: ется квалификатор — имя внешнего пространства. |