2009-06-22 7 views
1

Мне нравится концепция пространств имен C++, потому что они помогают сохранить исходный код кратким, избегая конфликтов имен. В .cpp-файлах это работает очень хорошо, используя объявление «using namespace». Однако в заголовочных файлах это невозможно использовать, так как оно «разрывает» пространство имен, что означает, что «использование пространства имен» применяется не только в текущем файле заголовка, но и во всем, что скомпилировано после этого. Это частично сводит на нет преимущества пространств имен. Рассмотрим, например, заголовочный файл, в котором часто используются классы «ourlib :: networking :: IpAddress» и «ourlib :: filesystem :: Path».Пространства имен в файлах заголовков C++

Есть ли способ ограничить эффект «использования пространства имен» -декламацией в файлах заголовков?

ответ

2

Нет, это не может быть сделано :(

0

Вы можете просто импортировать одиночные классы:

using ourlib::networking::lpAddress; 

По крайней мере, если я правильно помню;)

Это может загрязнять глобальное пространство имен до сих пор, хотя. Я просто живу с длинными префиксами пространства имен в файлах заголовков. Это облегчает чтение файла заголовка для других разработчиков (поскольку вам не нужно искать, какой класс приходит из какого пространства имен).

+2

> Это может загрязнять глобальное пространство имен <это будет загрязнять глобальное пространство имен – Artyom

+0

Зависит от того, что вы подразумеваете под загрязнением. На мой взгляд, импортирование одного класса может штрафом, если он ограничен файлами реализации, включая заголовок. Обычно я включаю только заголовки в другие заголовки, если это абсолютно необходимо, и вместо этого переходите к форвардным объявлениям. Это скорее улучшает время компиляции. – OregonGhost

+0

Я забыл добавить, кроме этого, я agr с тобой. Как я уже сказал, я использую только полные имена. – OregonGhost

4

Вы может положить, большинство часто используют классы в пространстве имен :: ourlib как

namespace ourlib { 
    using networking::lpAddress; 
} 

Так что, если они уникальны в проекте, скорее всего, у вас не будет проблем. Таким образом, в любое место в заголовках вы могли бы доступ lpAddress непосредственно без создания в глобальное пространство имен (я предполагаю, что все заголовки внутри namespace ourlib)

Смежные вопросы