1. к элементам, объевленным в неименованном пр-ве имен, можно получить доступ только в той же единице компиляции.
2. единица компиляции — cpp — ик со всеми включенными в него хидерами.
3. во всех сpp -ах в которые я проиклюдю вышеуказнный хидер, а — будет досупна.
4. куда же не проинклюжу, не будет...
но ведь так же было бы и без безымянного пр-ва имен...
Здравствуйте, <Аноним>, Вы писали:
А>попрвьте меня плзз, где я не прав:
А>пусть у нас есть h-ик типа:
А>
А>namespace{
А> int a;
А>}
А>
А>1. к элементам, объевленным в неименованном пр-ве имен, можно получить доступ только в той же единице компиляции. А>2. единица компиляции — cpp — ик со всеми включенными в него хидерами. А>3. во всех сpp -ах в которые я проиклюдю вышеуказнный хидер, а — будет досупна. А>4. куда же не проинклюжу, не будет...
А>но ведь так же было бы и без безымянного пр-ва имен...
А>зы пните меня плзз, где я туплю
По-моему, безымянное пространство имён — аналог static для переменных. Т.е. в каждой единице трансляции будет свой "int a;", а без static или namespace будет один на всех, точнее надо в одной единице определить, а в других extern'ом объявить.
IMHO.
Posted using RSDN@HOME
Re[2]: смысл unnamed namespace
От:
Аноним
Дата:
03.08.06 05:53
Оценка:
Здравствуйте, valker, Вы писали:
V>По-моему, безымянное пространство имён — аналог static для переменных. Т.е. в каждой единице трансляции будет свой "int a;", а без static или namespace будет один на всех, точнее надо в одной единице определить, а в других extern'ом объявить.
Спасибо!
А как быть с функциями и классами определенными там же?
You can declare an unnamed namespace as a superior alternative to the use of global static variable declarations.
namespace { namespace-body }
An unnamed-namespace-definition having the syntax shown above behaves as if it were replaced by:
namespace unique { namespace-body }
using namespace unique;
Each unnamed namespace has an identifier, assigned and maintained by the program and represented here by unique, that differs from all other identifiers in the entire program. For example:
Unnamed namespaces are a superior replacement for the static declaration of variables. They allow variables and functions to be visible within an entire translation unit, yet not visible externally. 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.
Можно посмотреть и стандарт:
7.3.1.1 Unnamed namespaces [namespace.unnamed]
1 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 uniquein a translation unit are replaced by the same identifier and this identifier differs from
all other identifiers in the entire program.87) [ Example:
namespace { int i ; } // unique::ivoid f () { i ++; } // unique::i++namespace A {
namespace {
int i; // A:: unique ::iint j; // A:: unique ::j
}
void g () { i ++; } // A:: unique ::i++
}
using namespace A;
void h () {
i ++; // error: unique ::i or A:: unique ::i
A::i ++; // A:: unique ::i
j ++; // A:: unique ::j
}
—end example ]
2 The use of the static keyword is deprecated when declaring objects in a namespace scope (see annex D); the unnamednamespace
provides a superior alternative.
Думаю это даст ответы на часть твоих вопросов
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: смысл unnamed namespace
От:
Аноним
Дата:
03.08.06 07:01
Оценка:
Здравствуйте, Master Yoda, Вы писали:
MY>Думаю это даст ответы на часть твоих вопросов
Спасибо, но я читал...
видно совсем туплю (
просто я не понимаю, что дает для функции локальное связывание.
пусть у меня есть две единицы компиляции с проинклюденным в них одним и тем же h-ом с функцией в безымянном пр-ве имен. Получается у меня будет два независимых экземляра этой функции? нафига?
Здравствуйте, <Аноним>, Вы писали:
А>просто я не понимаю, что дает для функции локальное связывание.
Вообще-то, элементы безымянного пространства имеют внешнее связывание. В этом их выгодное отличие от статиков: указатели можно использовать как параметры шаблонов.
А>пусть у меня есть две единицы компиляции с проинклюденным в них одним и тем же h-ом с функцией в безымянном пр-ве имен. Получается у меня будет два независимых экземляра этой функции? нафига?
Например, разные комплекты статических переменных этой функции в каждом .cpp-файле. Пригодится! (Не могу придумать, как именно... но например, для отладки).
Кодт wrote: > Например, разные комплекты статических переменных этой функции в каждом > .cpp-файле. Пригодится! (Не могу придумать, как именно... но например, > для отладки).
Еще безымянные пространства имен используются в качестве защиты от
слишком умного ADL.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[4]: смысл unnamed namespace
От:
Аноним
Дата:
03.08.06 07:41
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Вообще-то, элементы безымянного пространства имеют внешнее связывание. В этом их выгодное отличие от статиков: указатели можно использовать как параметры шаблонов.
Все, тогда я совсем в ступоре.
нафига тогда ентот безымянный нужен?
только для объектов, для замены static? ну тогда задача выеденного яйца не стоит.
с функциями получается никакой выгоды нет... с классами то же.
разве если токо использовать быз. пр-во имен в cpp-ах? Ну так их оттуда всеравно видно не будет...
ЗЫ Видно спать надо больше.. а то я тут вторую ночь подряд за компом мозги в ступоре полном ((
но интересно блин оторваться не могу...
Здравствуйте, Аноним, Вы писали:
К>>Вообще-то, элементы безымянного пространства имеют внешнее связывание. В этом их выгодное отличие от статиков: указатели можно использовать как параметры шаблонов.
А>Все, тогда я совсем в ступоре. А>нафига тогда ентот безымянный нужен? А>только для объектов, для замены static? ну тогда задача выеденного яйца не стоит. А>с функциями получается никакой выгоды нет... с классами то же. А>разве если токо использовать быз. пр-во имен в cpp-ах? Ну так их оттуда всеравно видно не будет...
Здравствуйте, <Аноним>, Вы писали:
А>Все, тогда я совсем в ступоре. А>нафига тогда ентот безымянный нужен?
Скажем так: пока он тебе не пригодился — не пользуйся. Делов-то.
А>только для объектов, для замены static? ну тогда задача выеденного яйца не стоит. А>с функциями получается никакой выгоды нет... с классами то же. А>разве если токо использовать быз. пр-во имен в cpp-ах? Ну так их оттуда всеравно видно не будет...
Здесь мы коварным образом нарушили ODR: определили локальные по своей сути классы hello.
Поскольку их методы (конструктор, деструктор и run()) инлайновые, то компилятор помечает их как selectany. Если он не захочет их инлайнить (например, в дебаге), то линкер случайным образом их выберет.
Может получиться такая картина:
— main вызывает run_a
— run_a вызывает случайный foo<hello>::run (для helloa или hellob)
— та, в свою очередь,
— — размещает на стеке объект helloa или hellob соответственно (здесь ещё всё в порядке)
— — вызывает случайный конструктор (удар №1 — можем расстрелять стек, поскольку размеры классов не совпадают)
— — вызывает случайный hello::run
— — — тот обращается к данным (удар №2 — например, реинтерпретация int как string)
— — вызывает случайный деструктор (удар №3 — создавали один объект, грухнули другой)
Конечно, в таком простом примере это всё надуманно: достаточно дать классам уникальные имена. А если классы генерируются макросом?