//
namespace QueryLib {
class Query { /* ... */ };
Query operator&(const Query&, const Query&);
// ...
}
//
//
namespace Bookstore {
class Quote { /* ... */ };
class Disc_quote : public Quote { /* ... */ };
// ...
}
}
Вложенное пространство имен — это вложенная область видимости, ее область видимости вкладывается в пределы содержащего ее пространства имен. Имена вложенных пространств имен подчиняются обычным правилам: имена, объявленные во внутреннем пространстве имен, скрывают объявления того же имени во внешнем пространстве. Имена, определенные во вложенном пространстве имен, являются локальными для внутреннего пространства имен. Код во внешних частях окружающего пространства имен может обратиться к имени во вложенном пространстве имен только через его квалифицированное имя. Например, имя класса QueryLib
, объявленного во вложенном пространстве имен, выглядит следующим образом:
cplusplus_primer::QueryLib::Query
Для определения встраиваемого пространства имен ключевое слово namespace
предваряется ключевым словом inline
:
inline namespace FifthEd {
//
}
namespace FifthEd { //
class Query_base { /* ... */};
//
}
Это ключевое слово должно присутствовать в первом определении пространства имен. Если пространство имен вновь открывается позже, ключевое слово inline
не обязательно, но может быть повторено.
Встраиваемые пространства имен зачастую используются при изменении кода от одного выпуска приложения к следующему. Например, весь код текущего издания
namespace FourthEd {
class Item_base { /* ... */};
class Query_base { /* ... */};
//
}
Общее пространство имен cplusplus_primer
включило бы определения обоих пространств имен. Например, с учетом того, что каждое пространство имен было определено в заголовке с соответствующим именем, пространство имен cplusplus_primer
можно определить следующим образом:
namespace cplusplus_primer {
#include "FifthEd.h"
#include "FourthEd.h"
}
Поскольку пространство имен FifthEd
встраиваемое, код обращающийся к имени из пространства имен cplusplus_primer::
, получит версию из этого пространства имен. Если понадобится код прежнего издания, к нему можно обратиться как к любому другому вложенному пространству имен, указав все имена окружающих пространств имен, например: cplusplus_primer::FourthEd::Query_base
.
У
Безымянное пространство имен может быть разобщено в пределах данного файла, но не охватывающих файлов. У каждого файла есть собственное безымянное пространство имен. Если два файла содержат безымянные пространства имен, эти пространства имен не связаны. Оба безымянных пространства имен могут определить одинаковое имя, и эти определения будут относиться к разным сущностям. Если заголовок определяет безымянное пространство имен, то имена в этом пространстве определяют сущности, локальные для каждого файла, включенного в заголовок.