Использование пространства имен без имени над статическим - PullRequest
7 голосов
/ 23 ноября 2011

Можно ли предположить, что объект, объявленный в безымянном пространстве имен, эквивалентен, как если бы static?

namespace { int x; };//  #1

static int x; // #2

FWIK. В обоих случаях x будет иметь статическую продолжительность хранения и внутреннюю связь.
Так все ли правила объекта, объявленного как static, применимы к объекту в безымянном пространстве имен?

Например:

  • Каким будет порядок строительства и разрушения?это будет то же самое?
  • Могу ли я использовать ключевое слово extern с x в безымянном пространстве имен?

Ответы [ 2 ]

8 голосов
/ 23 ноября 2011

На большинство ваших вопросов ответили здесь. Для остальных:

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

Порядок не отличается от обычных глобальных.Так что это не то же самое, что статический.

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

Могу ли я использовать ключевое слово extern с x в безымянном пространстве имен?

Нет.Чтобы extern что-то, вы должны быть в состоянии напечатать его имя.И магия безымянного пространства имен в том, что вы не можете ввести его имя.Имя присваивается компилятором.Вы этого не знаете.Поэтому, если вы попытаетесь extern это сделать, вы вместо этого будете использовать что-то еще.

Если вы поместите безымянное пространство имен в заголовок, каждый включающий его модуль перевода получит свою версию переменной.Все они будут extern, но будут говорить о другой внешней переменной.

2 голосов
/ 23 ноября 2011

Оба имеют внутреннюю связь (одна в безымянном пространстве имен только в c ++ 11), но одна в безымянном пространстве имен не является членом глобального пространства имен.так, например, вы можете поместить x в безымянное пространство имен и глобальное пространство имен, и они не будут конфликтовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...