有什么需要指定“std”前缀?

时间:2011-03-09 00:02:31

标签: c++ std

我是编程的初学者,如果他们使用stdstd等任何std::cout函数,我经常会看到许多使用前缀std::cin的程序。我想知道它的目的是什么?它只是一种良好的编程方式还是有更多的东西?它对编译器有什么影响,还是可读性或者是什么?谢谢。

5 个答案:

答案 0 :(得分:12)

C ++有一个命名空间的概念。

namespace foo {
  int bar();
}

namespace baz {
  int bar();
}

这两个函数可以共存而不会发生冲突,因为它们位于不同的名称空间中。

大多数标准库函数和类都位于“std”命名空间中。要访问例如cout,您需要按照优先顺序执行以下操作之一:

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

上面的foo和baz命名空间证明了你应该避免使用using的原因。如果您有using namespace foo; using namespace baz;任何尝试呼叫bar()的话都会模棱两可。使用命名空间前缀是明确而准确的,也是一种好习惯。

答案 1 :(得分:11)

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。

答案 2 :(得分:2)

在他们的回答中没有人提到可以在函数体内放置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语句。

答案 3 :(得分:1)

它是标准命名空间的缩写。

您可以使用:

using namespace std

如果你不想继续使用std :: cout而只是使用cout

答案 4 :(得分:1)

这是一个名为namespaces的C ++特性:

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;以避免使用前缀,如果您能够克服缺点(名称冲突,不太清楚函数所属的位置,......)。