Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Неименнованые пространства имен


Автор: Graf_h 26.5.2009, 14:43
Здравствуйте, помогите разобратся. В чем смисл использования неименнованых пространств имен??

Автор: mes 26.5.2009, 15:02
тут есть частичный  (однако, полагаю,  достаточный) разбор  этой темы   : http://forum.vingrad.ru/forum/topic-258558/kw-namespace-class-using.html

Автор: Alek86 26.5.2009, 16:12
безымянный неймспейс безымянен только для программиста и компилятора

перед линковкой подставляется рандомное и уникальное имя

потому есть гарантия, что линковщик не будет ругаться, если увидит 2 extern объекта ("глобальные" переменные, "глобальные" функции) с одинаковым имемнем но каждый в своем безымянном неймспейсе

Автор: zim22 26.5.2009, 16:35
Цитата(Graf_h @  26.5.2009,  14:43 Найти цитируемый пост)
Здравствуйте, помогите разобратся. В чем смисл использования неименнованых пространств имен??

Цитата из книги С++ Common Knowledge (Stephen Dewherst):
Использование анонимных простанств имён - самый передовой способ избежать объявления статически связанных функций и переменных. 
Код

namespace {
  int a = 12;
  int fcn() { return a; }
};

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

Автор: andrew_121 26.5.2009, 18:06
Цитата(zim22 @  26.5.2009,  16:35 Найти цитируемый пост)
В приведённом выше коде переменная и функцию имеют внешнее связывание, но доступ к ним может быть осуществлен только в рамках единицы трансляции (т.е. в полученном после предварительной обработке файле), в которой они находятся, точно так же, как к статическим переменным.

По подробней пожалуйста....

Автор: zim22 26.5.2009, 18:26
Цитата(andrew_121 @  26.5.2009,  18:06 Найти цитируемый пост)
По подробней пожалуйста....

попробуйте обратиться к переменной a и функции fcn используя анонимное пространство имён, а не my_namespace. не получится. т.к. область видимости anonymous namespace - файл, в котором оно определено.

2.h
Код

namespace my_namespace {
  extern int a;
  extern int fcn();
}

2.cpp
Код

#include "2.h"
namespace my_namespace {
  int a = 12;
  int fcn() { return a; }
}

main.cpp
Код

#include "2.h"

int _tmain(int argc, _TCHAR* argv[])
{
  my_namespace::a = 20;
  int res = my_namespace::fcn();
    return 0;
}

Автор: andrew_121 26.5.2009, 19:47
zim22, Преогромное спасибо! Познавательно!

Автор: Graf_h 27.5.2009, 10:19
тоесть, это просто саособ избежать внешнего связывания? Если ми используем анонимные пространства т это будет примерно так?
Код

//test.h
namespace{
int a
}


В итоге при компоновке будет:
Код

namespace test{
int a
}

Автор: zim22 27.5.2009, 10:27
Цитата(Graf_h @  27.5.2009,  10:19 Найти цитируемый пост)
тоесть, это просто саособ избежать внешнего связывания? 

Стандарт. 7.3.1.1 Unnamed namespaces
An unnamed-namespace-definition behaves as if it were replaced by
Код

namespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

where all occurrences of unique in a translation unit are replaced by the same identifier and this identifier differs from all other identifiers in the entire program.
...
The use of the static keyword is deprecated when declaring objects in a namespace scope the unnamed-namespace provides a superior alternative.
...
Although entities in an unnamed namespace might have external linkage, they are effectively qualified by a name unique to their translation unit
and therefore can never be seen from any other translation unit.

Автор: Graf_h 27.5.2009, 11:27
zim22,  спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)