CC++Qt « using namespace std

Пробую постигнуть С++, т.е не то чтобы собираюсь но пробую а дальше буду решать продолжать или нет.

Может кто то из спецов по С++ рассказать когда нужно использовать using namespace std а когда нет.

Как правильнее, и почему правильный вариант таковым является.

Заранее спасибо, и прошу сильно не пинать за нубовский вопрос.

1 ответов


Для начала переведем на человеческий язык, что же значит using namespace std. А означает это "использовать пространство имен std".

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

Практически все стандартные библиотеки C++ (в том числе и STL - библиотека стандартных шаблонов) используют пространство имен std, именно поэтому практически всегда нужно писать using namespace std, либо вам придется каждый вызов функции из этих библиотек предворять префиксом пространства имен std::.

При этом нельзя просто написать using namespace std, пространство имен должно быть обязательно объявлено в каком-либо из ранее включенных заголовочных файлов, например:


#include <iostream>
// пространство имен std объявляется в заголовочном файле iostream
using namespace std;
int main()
{
    cout << "Hello, world!" << endl;
    return 0;
}
 

Вот неполный список заголовочных файлов из стандартной библиотеки С++ - для всех их нужно использовать пространство имен std (источник - MSDN):

<algorithm>
<bitset>
<cassert>
<cctype>
<cerrno>
<cfloat>
<ciso646>
<climits>
<clocale>
<cmath>
<complex>
<csetjmp>
<csignal>
<cstdarg>
<cstddef>
<cstdio>
<cstdlib>
<cstring>
<ctime>
<cwchar>
<cwctype>
<deque>
<exception>
<fstream>
<functional>
<hash_map>
<hash_set>
<iomanip>
<ios>
<iosfwd>
<iostream>
<iso646.h>
<istream>
<iterator>
<limits>
<list>
<locale>
<map>
<memory>
<new>
<numeric>
<ostream>
<queue>
<set>
<sstream>
<stack>
<stdexcept>
<streambuf>
<string>
<strstream>
<utility>
<valarray>
<vector>
 

Дело в том, что используя директиву using namespace вы значительно повышаете риски пересечения имён, поэтому использовать using не рекомендуется в принципе, но если уж сильно хочется, то делать это только в .cpp файлах, а ещё лучше в отдельных функциях.


Если половина строчек содержит std:: то лучше с начало попробовать using декларации, например:


#include <iostream>
#include <list>

int main()
{
    using std::cout;
    using std::endl;
    cout << "hello world" << endl;

    using std::list;
    list<int> n;
    return 0;
}
 
Это снизит вероятность пересечения имен.

Google не рекомендует использовать using-directive.


using namespace - это просто сообщение компилятору "везде, где ты не узнал переменную, попробуй подставить к ней этот префикс".
Я обычно это не использую и пишу std::vector<>, std::sort(), но если в модуле половина строчек начинается с этого префикса - кто будет слушать какой-то Гугль? ;)



using namespace std;
 
это using директива(using-directive). Ее использовать запрещено, так как ее использование приводит к засорению пространства имен и конфликтов имён типов. Пример:


// <vector>
namespace std
{
    template < class T, class Allocator = allocator<T> >
      class vector // STL vector
   {
        // ...
   };
}
 


// "mylib.h"
template < class T >
   class vector // мой личный vector
   {
        // ...
   };

 


// file.cpp
#include <vector>
#include "mylib.h"

int main()
{
    vecor < int > x; // мой личный vector ( mylib.h не определяет пространства имен)

    using namespace std;

   vecor < int > y; // какой это vector? двусмысленное определение
}
 


using std::vector;
 
это using обьявление(using-declaration). Его допускается использовать в срр и сс файлах. А так же внутри функции или класса, см. google-style-guide