Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неименнованые пространства имен 
:(
    Опции темы
Graf_h
Дата 26.5.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: 2
Всего: 5



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


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
mes
Дата 26.5.2009, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



тут есть частичный  (однако, полагаю,  достаточный) разбор  этой темы   : http://forum.vingrad.ru/forum/topic-258558...lass-using.html


Это сообщение отредактировал(а) mes - 26.5.2009, 15:04


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 26.5.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



безымянный неймспейс безымянен только для программиста и компилятора

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

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

Это сообщение отредактировал(а) Alek86 - 26.5.2009, 16:13


--------------------
user posted image    user posted image
PM MAIL   Вверх
zim22
Дата 26.5.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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

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

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

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



--------------------
PM MAIL   Вверх
andrew_121
Дата 26.5.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 26.5.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(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;
}



--------------------
PM MAIL   Вверх
andrew_121
Дата 26.5.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



zim22, Преогромное спасибо! Познавательно!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Graf_h
Дата 27.5.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: 2
Всего: 5



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

//test.h
namespace{
int a
}


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

namespace test{
int a
}



--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
zim22
Дата 27.5.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(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.



--------------------
PM MAIL   Вверх
Graf_h
Дата 27.5.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: 2
Всего: 5



zim22,  спасибо


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.