Использование безымянного пространства имен в C ++ - PullRequest
67 голосов
/ 15 марта 2011

Когда можно использовать безымянное пространство имен в C ++? Это лучше в каком-то смысле, чем свободностоящая функция? Кроме того, должен ли он использоваться только в исходном файле, а не в заголовочном файле?

Ответы [ 5 ]

59 голосов
/ 15 марта 2011

Согласно Страуструпу, вы должны использовать его в тех местах, где в старом С вы бы сделали static глобал.Идея состоит в том, что рассматриваемые элементы могут быть «глобальными» для исходного файла, в котором они находятся, но не загрязнять пространство имен любых других исходных файлов в вашей компиляции.не будет создавать static глобалы в C ++ .Вместо этого вы должны использовать безымянные пространства имен.

Я обнаружил некоторые ситуации, когда они полезны в заголовочных файлах, но это должно быть редко.Главным образом я думаю для объявления бросаемых исключений.В этом случае рассматриваемые определения будут глобальными для всего, что #include с этим заголовком, но не для вещей, которые этого не делают.

27 голосов
/ 15 марта 2011

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

Например, вам нужен классэто будет определено только в файле .cpp и использовано только в этом файле.Вы хотите назвать это CModuleLock.Если он не находится в безымянном пространстве имен, а какой-то другой файл .cpp случайно имеет другой класс CModuleLock, не входящий в безымянное пространство имен, вы не сможете связать свою программу.

10 голосов
/ 15 марта 2011

Используется для сокрытия имени. Каждое безымянное пространство имен уникально. Ссылка здесь объясняет более подробно. Обычно он используется в исходном файле, чтобы скрыть функции, которые должны иметь только внутреннюю связь (например, не подвергаться воздействию внешнего мира).

1 голос
/ 31 августа 2017

По существу, пространство имен решает конфликты между одинаковыми классами имен, идентификаторами и функциями. Для получения дополнительной информации нажмите на ссылку, приведенную ниже. https://simplifiedtutorial4u.blogspot.in/2017/08/what-is-namespace-in-c.html

1 голос
/ 15 марта 2011

Безымянные пространства имен являются «версией C ++» глобальных статических переменных и функций.Обратите внимание, что вы также можете использовать безымянное пространство имен для классов.

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