Какая необходимость указывать префикс std?

Я новичок в программировании, и я часто вижу много программ, использующих префикс std, если они используют какие-либо функции std, такие как std::cout, std::cin и т. д. Мне было интересно, для чего это нужно? Это просто способ хорошего программирования или есть нечто большее? Имеет ли это какое-то значение для компилятора или это читабельность или что? Спасибо.


person 0x0    schedule 09.03.2011    source источник
comment
Потому что ваши программы не будут компилироваться без него?   -  person Chinmay Kanchi    schedule 09.03.2011
comment
Также см.: stackoverflow .com/questions/2218140/   -  person Tugrul Ates    schedule 09.03.2011


Ответы (5)


Типы и функции STL определены в пространстве имен с именем std. Префикс std:: используется для использования типов без полного включения пространства имен std.

Вариант 1 (используйте префикс)

#include <iostream>

void Example() {
  std::cout << "Hello World" << std::endl;
}

Вариант №2 (использовать пространство имен)

#include <iostream>
using namespace std;

void Example() {
  cout << "Hello World" << endl;
}

Вариант №3 (используйте типы по отдельности)

#include <iostream>
using std::cout;
using std::endl;

void Example() {
    cout << "Hello World" << endl;
}

Примечание. Существуют и другие последствия включения всего пространства имен C++ (вариант № 2), кроме отсутствия необходимости добавлять префикс std:: к каждому типу/методу (особенно если это делается в файле заголовка). Многие программисты на C++ избегают этой практики и предпочитают №1 или №3.

person JaredPar    schedule 09.03.2011
comment
@ Эрик, это был еще один вариант, о котором я упоминал. Я сделаю это явным - person JaredPar; 09.03.2011
comment
Я хотел бы отметить, что вы никогда не должны включать все пространство имен в свой заголовочный файл. Он также будет включен в исходный код пользователя (включая ваш заголовок), а это не то, что вам нужно. - person Adam Trhon; 09.03.2011
comment
@Dadam, в последнем абзаце моего ответа говорится, что № 2 не следует делать в заголовке. - person JaredPar; 09.03.2011
comment
Обратите внимание, что № 3 особенно предпочтителен для функции (шаблона) std::swap, потому что using std::swap; swap(a,b); — это способ гарантировать, что вы получите перегруженный ADL swap, если он существует, и скучный старый std::swap, если его нет. std::swap может быть специализирован для пользовательских классов по одному, но для пользовательских шаблонов классов ADL является единственным законным способом предоставления пользовательского обмена. Однако семантика перемещения как бы решает эту проблему, возможно, этот стиль использования std::swap может измениться в C++0x. - person Steve Jessop; 09.03.2011
comment
Вместо того, чтобы называть это STL, правильным термином будет стандартная библиотека C++. (Настоящая STL устарела, устарела и несовместима со стандартом, а в пространстве имен std есть вещи, которых не было в STL.) - person Kristopher Johnson; 09.03.2011
comment
STL здесь неправильный термин. Он только применяется к частям контейнеров и алгоритмов стандартной библиотеки. Ничего больше. (см. Страуструп/Саттер/Мейерс/и т. д.) - person Galik; 19.12.2017

C++ имеет концепцию пространств имен.

namespace foo {
  int bar();
}

namespace baz {
  int bar();
}

Эти две функции могут сосуществовать без конфликтов, поскольку они находятся в разных пространствах имен.

Большинство стандартных библиотечных функций и классов находятся в пространстве имен "std". Для доступа, например. cout вам необходимо выполнить одно из следующих действий в порядке предпочтения:

  • std::cout << 1;
  • using std::cout; cout << 1;
  • using namespace std; cout << 1;

Причина, по которой вам следует избегать using, демонстрируется приведенными выше пространствами имен foo и baz. Если бы у вас был using namespace foo; using namespace baz;, любая попытка позвонить bar() была бы неоднозначной. Использование префикса пространства имен является явным и точным и является хорошей привычкой.

person Erik    schedule 09.03.2011

Никто не упомянул в своем ответе, что оператор using namespace foo можно поместить внутрь тела функции, тем самым уменьшив загрязнение пространства имен в других областях.

Например:

// This scope not affected by using namespace statement below.

void printRecord(...)
{
    using namespace std;
    // Frequent use of std::cout, io manipulators, etc...
    // Constantly prefixing with std:: would be tedious here.
}

class Foo
{
   // This scope not affected by using namespace statement above.
};

int main()
{
   // This scope not affected either.
}

Вы даже можете поместить оператор using namespace foo в локальную область видимости (пара фигурных скобок).

person Emile Cormier    schedule 09.03.2011

Это функция С++, называемая пространствами имен:

namespace foo {
   void a();
}


// ...

foo::a();

// or:

using namespace foo;
a(); // only works if there is only one definition of `a` in both `foo` and global scope!

Преимущество в том, что может быть несколько функций с именами a — пока они находятся в разных пространствах имен, их можно использовать однозначно (например, foo::a(), another_namespace::a()). Для этой цели вся стандартная библиотека C++ находится в std.

Используйте using namespace std;, чтобы избежать префикса, если вы можете столкнуться с недостатками (конфликты имен, менее понятно, к чему относится функция, ...).

person Alexander Gessler    schedule 09.03.2011

Это сокращение от стандартного пространства имен.

Вы можете использовать:

using namespace std

если вы не хотите продолжать использовать std::cout и просто используете cout

person Steve    schedule 09.03.2011
comment
Я не соглашусь здесь. std:: предпочтительнее using namespace std - person Tim; 09.03.2011
comment
Если вы обычно используете это, остановитесь. Смотрите ответ @Erik. - person Chinmay Kanchi; 09.03.2011
comment
Ладно, обычно это было неподходящее слово. Изменил это, чтобы означать то, что я имел в виду. - person Steve; 09.03.2011