Псевдоним пространства имен может быть также применен к вложенному пространству имен:
namespace Qlib = cplusplus_primer::QueryLib;
Qlib::Query q;
using
(напоминание)Имена, представленные в объявлении using
, подчиняются обычным правилам области видимости. Имя видимо от точки объявления using
и до конца области видимости, в которой оно объявлено. Сущности внутренней области видимости скрывают одноименные сущности внешней. Короткие имена могут использоваться только в той области видимости, в которой они объявлены, а также в областях видимости, вложенных в нее. По завершении области видимости следует использовать полные имена.
Объявление using
может присутствовать в глобальной и локальной области видимости, а также в области видимости пространства имен или класса. Объявление using
в области видимости класса ограничено именами, определенными в базовом классе определяемого класса (см. раздел 15.5).
using
Подобно объявлению using
, using
(using directive) позволяет использовать не квалифицированную форму имен. Однако, в отличие от объявления using
, здесь не сохраняется контроль над видимостью имен, поскольку все они видимы.
Директива using
начинается с ключевого слова using
, за которым следует ключевое слово namespace
, сопровождаемое именем пространства имен. Если имя пространства не было определено ранее, произойдет ошибка. Директива using
может присутствовать в глобальной, локальной области видимости или в пространстве имен. Она не может присутствовать в области видимости класса.
using
для таких пространств имен, как std
, которые приложение не контролирует, возвращает все проблемы конфликта имени, присущие использованию нескольких библиотек.
using
и область видимостиОбласть видимости имен, указанных директивой using
, гораздо сложнее, чем в случае объявления using
. Объявление using
помещает имя непосредственно в ту же область видимости, в которой находится само объявление using
. Объявление using
подобно локальному псевдониму для члена пространства имен.
Директива using
не объявляет локальные псевдонимы для имен членов пространства имен. Вместо этого она поднимает члены пространства имен в ближайшую область видимости, которая содержит и пространство имен, и саму директиву using
.
Различие в области видимости между объявлением using
и директивой using
проистекает непосредственно из принципа действия этих средств. В случае объявления using
само имя просто становится доступным в локальной области видимости. Директива using
, напротив, делает доступным все содержимое пространства имен. Вообще, пространство имен способно включать определения, которые не могут присутствовать в локальной области видимости. Как следствие, директива using
рассматривается как присутствующая в ближайшей области видимости окружающего пространства имен.
Рассмотрим самый простой случай. Предположим, что в глобальной области видимости определено пространство имен А
и функция f()
. Если функция f()
имеет директиву using
для пространства имен А
, функция f()
будет вести себя так, как будто имена пространства имен А
присутствовали в глобальной области видимости до определения функции f()
.
//
//
namespace А {
int i, j;
}
void f() {
using namespace A; //
//
cout << i * j << endl; //
// ...
}
using
Рассмотрим следующий пример:
namespace blip {
int i = 16, j = 15, k = 23; //
}
int j = 0; //
void manip() {
//
//
using namespace blip; //
//
++i; //
++j; //