Хороший вопрос, Райан. using namespace
выполняет импорт всех символов из заданного пространства имен (области) в область, где он использовался. Например, вы можете сделать следующее:
namespace A {
struct foo {};
}
namespace B {
using namespace A;
struct bar : foo {};
}
В приведенных выше примерах все символы в пространстве имен A
становятся видимыми в пространстве имен B
, как они были объявлены там.
Этот импорт влияет только на данную единицу перевода. Так, например, когда в вашем файле реализации (т.е. .cpp
) вы делаете using namespace std;
, вы в основном импортируете все символы из пространства имен std
в глобальную область.
Вы также можете импортировать определенные символы, а не все, например:
using std::cout;
using std::endl;
Вы можете сделать это в глобальной области видимости, области имен или области функций, например:
int main ()
{
using namespace std;
}
Программист должен решить, когда использовать полные имена и когда использовать ключевое слово using
. Обычно помещать using
в заголовочные файлы очень неприятно. Профессиональные программисты на C ++ почти никогда не делают этого, если только это не необходимо для обхода какой-либо проблемы, или они на 100% уверены, что это не испортит разрешение типов для тех, кто использует этот заголовок.
Однако внутри исходного файла (никто не включает в себя исходные файлы) можно использовать любые операторы, если в разных пространствах имен нет конфликтующих имен. Это только вопрос вкуса. Например, если во всем коде используются тонны символов из разных пространств имен, я бы предпочел, по крайней мере, несколько подсказок относительно того, где они фактически объявлены. Но все знакомы с STL, поэтому using namespace std;
никогда не должно причинять вреда.
Также могут быть некоторые длинные пространства имен, и в этих случаях удобно использовать псевдонимы пространства имен. Например, есть библиотека Boost.Filesystem, которая помещает все свои символы в пространство имен boost::filesystem
. Использование этого пространства имен было бы слишком много, поэтому люди обычно делают что-то вроде этого:
namespace fs = boost::filesystem;
fs::foo ();
fs::bar ();
Кроме того, почти нормально использовать псевдонимы пространства имен в заголовках, например:
namespace MyLib {
namespace fs = boost::filesystem;
}
.. и получайте меньше печатания. В результате пользователи, которые будут использовать этот заголовок, не будут импортировать всю библиотеку файловой системы, говоря using namespace MyLib;
. Но затем они импортируют пространство имен "fs" из вашей библиотеки, которое может конфликтовать с чем-то другим. Так что лучше этого не делать, но если вы хотите этого слишком сильно, это лучше, чем сказать using namespace boost::filesystem
там.
Итак, вернемся к вашему вопросу. Если вы пишете библиотеку, используя потоки ввода / вывода C ++, лучше не иметь никаких using
операторов в заголовках, и я бы пошел с using namespace std;
в каждом cpp
файле. Например:
somefile.hpp:
namespace mylib {
class myfile : public std::fstream {
public:
myfile (const char *path);
// ...
};
}
somefile.cpp:
#include "somefile.hpp"
using namespace std;
using namespace mylib;
myfile::myfile (const char *path) : fstream (path)
{
// ...
}