МоёМесто

Сохраненная страница Ответы@Mail.Ru: вопрос по С++. объясните что такое пространство имен?зачем нужны..как юзаются...и тд..а то я вообще не врубаю)) (78 Kb)

В принципе любая пара скобочек {} определяет пространство имен. Любые переменные объявленные в этом пространстве не будут видны из другого места. Так было еще в просто СИ, но в нем не было такого понятия "пространство имен". Вместо этого использовалось понятие "область видимости переменной". В С++ появилось namespace - пространство имен. Для того чтобы глобальное пространство имен распилить на независимые зоны во избежание конфликтов имен переменных и функций. При этом к памяти, как утверждает предыдущий постер, это никакого отношения не имеет. Это нужно компилятору чтобы не путать одни сущности с другими.
Например
namespace foo
{
int Var; // глобальная переменная
void Func(int Var); // функция
}
namespace ess
{
int Var; // глобальная переменная
void Func(int Var); // функция
}

Несмотря на то что разные переменные и функции названы одинаково, компилятор их никогда не перепутает, потому что они лежат в разных пространствах имен. Доставать их следует используя имя пространства.
foo::Var; // переменная из одного пространства
ess::Var; // переменная из другого пространства
В функциями так же. Если страдаете ленью и не хочется лишний раз писать спецификатор имени, то можно воспользоваться директивой using namespace foo; Тогда компилятор будет знать, что имена нужно искать не только в глобальном пространстве, но и в указанном.

Если указать список пространства (как в примере)
using namespace foo;
using namespace ess;

Тогда уже можно запутать компилятор, он найдет в обоих пространствах нечто подходящее, а что требуется вам - уже не понятно. Так что директивой using namespace нужно тоже пользоваться аккуратно (либо не пользоваться без необходимости).
Впрочем можно указать не все пространство имен, а только его часть.
using namespace foo::Func;

namespace открыты и расширяемы. Открыты - значит, что ко всему что определено в них можно получить доступ из другого места.
Расширяемы - значит что содержимое пространства имен не обязательно должно быть в одном файле, и всегда пространство имен можно чем нибудь дополнить.
namespace foo
{
int Var2; // другая глобальная переменная, которую добавили в уже существующее пространство
}

Но есть еще анонимные пространства имен. Они просто не содержат имени. С ними все наоб

скачать