8.5.1. Определения пространства имен

8.5.1. Определения пространства имен

Определение пользовательского пространства имен начинается с ключевого слова namespace, за которым следует идентификатор. Он должен быть уникальным в той области видимости, в которой определяется данное пространство; наличие другой сущности с тем же именем является ошибкой. Конечно, это не означает, что проблема засорения глобального пространства решена полностью, но существенно помогает в ее решении.

За идентификатором пространства имен следует блок в фигурных скобках, содержащий различные объявления. Любое объявление, допустимое в области видимости глобального пространства, может встречаться и в пользовательском: классы, переменные (вместе с инициализацией), функции (вместе со своими определениями), шаблоны.

Помещая объявление в пользовательское пространство, мы не меняем его семантики. Единственное отличие состоит в том, что имена, вводимые такими объявлениями, включают в себя имя пространства, внутри которого они объявлены. Например:

namespace cplusplus_primer {

class matrix { /* ... */ };

void inverse ( matrix );

matrix operator+ ( const matrix ml, const matrix m2 )

{/* ... */ }

const double pi = 3.1416;

}

Именем класса, объявленного в пространстве cplusplus_primer, будет

cplusplus_primer::matrix

Именем функции

cplusplus_primer::inverse()

Именем константы

cplusplus_primer::pi

Имя класса, функции или константы расширяется именем пространства, в котором они объявлены. Такие имена называют квалифицированными.

Определение пространства имен не обязательно должно быть непрерывным. Например, предыдущее пространство могло быть определено таким образом:

namespace cplusplus_primer {

class matrix { /* ... */ };

const double pi = 3.1416;

}

namespace cplusplus_primer {

void inverse ( matrix );

matrix operator+ ( const matrix ml, const matrix m2 )

{/* ... */ }

}

Два приведенных примера эквивалентны: оба задают пространство имен cplusplus_primer, содержащее класс matrix, функцию inverse(), константу pi и operator+(). Определение пространства имен может состоять из нескольких соединенных частей.

Последовательность

namespace namespace_name {

задает новое пространство, если имя namespace_name не совпадает с одним из ранее объявленных. В противном случае новые объявления добавляются в старое пространство.

Возможность разбить пространство имен на несколько частей помогает при организации библиотеки. Ее исходный код легко разделить на интерфейсную часть и реализацию. Например:

// Эта часть пространства имен

// определяет интерфейс библиотеки

namespace cplusplus_primer {

class matrix { /* ... */ };

const double pi = 3.1416;

matrix operator+ ( const matrix ml, const matrix m2 );

void inverse ( matrix );

}

// Эта часть пространства имен

// определяет реализацию библиотеки

namespace cplusplus_primer {

void inverse ( matrix m )

{ /* ... */ }

matrix operator+ ( const matrix ml, const matrix m2 )

{ /* ... */ }

}

Первая часть пространства имен содержит объявления и определения, служащие интерфейсом библиотеки: определения типов, констант, объявления функций. Во второй части находятся детали реализации, то есть определения функций.

Еще более полезной для организации исходного кода библиотеки является возможность разделить определение одного пространства имен на несколько файлов: эти определения также объединяются. Наша библиотека может быть устроена следующим образом:

// ---- primer.h ----

namespace cplusplus_primer {

class matrix { /*... */ };

const double pi = 3.1416;

matrix operator+ ( const matrix m1, const matrix m2 );

void inverse( matrix );

}

// ---- primer.C ----

#include "primer.h"

namespace cplusplus_primer {

void inverse( matrix m )

{ /* ... */ }

matrix operator+ ( const matrix m1, const matrix m2 )

{ /* ... */ }

}

Программа, использующая эту библиотеку, выглядит так:

// ---- user.C ----

// определение интерфейса библиотеки

#include "primer.h"

void func( cplusplus_primer::matrix m )

{

//...

cplusplus_primer: :inverse( m );

return m;

}

Подобная организация программы обеспечивает модульность библиотеки, необходимую для сокрытия реализации от пользователей, в то же время позволяя без ошибок скомпилировать и связать файлы primer.C и user.C в одну программу.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Пользовательские пространства имен

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Пользовательские пространства имен До этого момента мы создавали небольшие тестовые программы, используя пространства имен, существующие в среде .NET (в частности, пространство имен System). Но иногда при создании приложения бывает удобно объединить связанные типы в одном


Вложенные пространства имен

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Вложенные пространства имен Совершенствуя организацию своих типов, вы имеете возможность определить пространства имен в рамках других пространств имен. Библиотеки базовых классов .NET часто используют такие вложений, чтобы обеспечить более высокий уровень организации


Дополнительные пространства имен ADO.NET

Из книги Стандарты программирования на С++. 101 правило и рекомендация автора Александреску Андрей

Дополнительные пространства имен ADO.NET В дополнение к пространствам имен .NET, определяющим типы конкретного поставщика данных, библиотеки базовых классов предлагают ряд дополнительных пространств имен, связанных с ADO.NET (табл. 22.4).Следует понимать, что эта глава не


Пространства имен ASP.NET 2.0

Из книги Технология XSLT автора Валиков Алексей Николаевич

Пространства имен ASP.NET 2.0 В библиотеках базовых классов .NET 2.0 предлагается не менее 34 пространств имен, имеющих отношение к Web. Всю эту совокупность пространств имен можно разбить на четыре главные группы.• Базовые функциональные возможности (типы, обеспечивающие


Пространства имен .NET для Web-сервисов XML

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Пространства имен .NET для Web-сервисов XML Теперь, когда у вас есть база для понимания принципов функционирования Web-сервисов XML, мы с вами можем заняться построением такого объекта в рамках платформы .NET. Библиотеки базовых классов определяют целый ряд пространств имен,


1.4. Пространства имен

Из книги C++ для начинающих автора Липпман Стенли

1.4. Пространства имен Если два неродственных процесса используют какой-либо вид IPC для обмена информацией, объект IPC должен иметь имя или идентификатор, чтобы один из процессов (называемый обычно сервером — server) мог создать этот объект, а другой процесс (обычно один или


Пространства имен и модули

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

Пространства имен и модули Системы имеют подсистемы, которые в свою очередь состоят из подсистем и так до бесконечности — именно поэтому мы всегда движемся сверху вниз. — Алан Перлис (Alan Perlis) Пространство имен — очень важный инструмент для управления именами и снижения


Пространства имен

Из книги автора

Пространства имен В программе на языке Си имена (идентификаторы) используются для ссылок на различного рода объекты — функции, переменные, формальные параметры и т. п. При соблюдении определенных правил, описанных в данном разделе, допускается использование одного и


2.7. Использование пространства имен

Из книги автора

2.7. Использование пространства имен Предположим, что мы хотим предоставить в общее пользование наш класс Array, разработанный в предыдущих примерах. Однако не мы одни занимались этой проблемой; возможно, кем-то где-то, скажем, в одном из подразделений компании Intel был


8.5. Определения пространства имен А

Из книги автора

8.5. Определения пространства имен А По умолчанию любой объект, функция, тип или шаблон, объявленный в глобальной области видимости, также называемой областью видимости глобального пространства имен, вводит глобальную сущность. Каждая такая сущность обязана иметь


8.5.3. Вложенные пространства имен

Из книги автора

8.5.3. Вложенные пространства имен Мы уже упоминали, что пользовательские пространства имен могут быть вложенными. Такие пространства применяются для дальнейшего структурирования кода нашей библиотеки.// ---- primer.h ----namespace cplusplus_primer {// первое вложенное пространство имен://


8.5.5. ПОО и члены пространства имен

Из книги автора

8.5.5. ПОО и члены пространства имен Как уже было сказано, определение пространства имен может состоять из разрозненных частей и размещаться в разных файлах. Следовательно, член пространства разрешено объявлять во многих файлах. Например:// primer.hnamespace cplusplus_primer {// ...void inverse(


8.5.6. Безымянные пространства имен

Из книги автора

8.5.6. Безымянные пространства имен Может возникнуть необходимость определить объект, функцию, класс или любую другую сущность так, чтобы она была видимой только в небольшом участке программы. Это еще один способ решения проблемы засорения глобального пространства


8.6.1. Псевдонимы пространства имен

Из книги автора

8.6.1. Псевдонимы пространства имен Псевдоним пространства имен используется для задания короткого синонима имени пространства. Например, длинное имяnamespace International_Business_Machines{ /* ... */ }может быть ассоциировано с более коротким синонимом:namespace IBM = International_Business_Machines;Объявление