我是编程的初学者,如果他们使用std
,std
等任何std::cout
函数,我经常会看到许多使用前缀std::cin
的程序。我想知道它的目的是什么?它只是一种良好的编程方式还是有更多的东西?它对编译器有什么影响,还是可读性或者是什么?谢谢。
答案 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;
以避免使用前缀,如果您能够克服缺点(名称冲突,不太清楚函数所属的位置,......)。