使用名称空间std 我在学校上了一个编程班,我想开始做一些课外的C++编程。我的学校使用微软Visual C++ 6(它是从1998),所以它仍然使用 而不是 >代码>使用命名空间STD 。当我开始工作时,我不知道如何以及何时使用使用名称空间std,以及何时只使用std::cout
之类的东西。如果使用标题名而不使用使用名称空间std 我在学校上了一个编程班,我想开始做一些课外的C++编程。我的学校使用微软Visual C++ 6(它是从1998),所以它仍然使用 而不是 >代码>使用命名空间STD 。当我开始工作时,我不知道如何以及何时使用使用名称空间std,以及何时只使用std::cout,c++,visual-c++,header,namespaces,std,C++,Visual C++,Header,Namespaces,Std,之类的东西。如果使用标题名而不使用.h,那么其中声明/定义的内容将位于std名称空间中。您只需使用名称空间std一次在您想要导入的范围内,以便获取所有内容;多个使用名称空间std没有任何帮助 我建议不要使用名称空间std一般来说。例如,我更喜欢说,使用std::cout取而代之,以避免std中的名字与我的名字冲突 例如: #include <iostream> #include <iomanip> int main() { using namespac
.h
,那么其中声明/定义的内容将位于std
名称空间中。您只需使用名称空间std代码>一次在您想要导入的范围内,以便获取所有内容;多个使用名称空间std代码>没有任何帮助
我建议不要使用名称空间std但是,代码>一般来说。例如,我更喜欢说,使用std::cout代码>取而代之,以避免std
中的名字与我的名字冲突
例如:
#include <iostream>
#include <iomanip>
int main()
{
using namespace std;
int left = 1, right = 2;
cout << left << " to " << right << "\n";
}
using std::cout;
using std::endl;
或
#包括
#包括
int main()
{
int左=1,右=2;
std::cout是描述名称空间及其工作方式的一个很好的链接
这两种方法都是正确的,也就是说,您可以使用“using”语句引入名称空间,也可以限定名称空间的所有成员。这是一个编码风格的问题。我更喜欢使用名称空间限定,因为它可以让读者清楚地知道函数/类是在哪个名称空间中定义的
此外,如果包含多个文件,则不必两次引入名称空间。一个using语句就足够了。特定于使用名称空间std
您真的不应该在头文件中使用它。这样做,您已经将包含您的头文件的任何人或包含您的文件的任何其他人的整个“std”导入全局命名空间
在.cpp文件中使用它,这是个人的偏好。我通常不会将整个std导入全局名称空间,但为了节省一点输入,自己这样做似乎没有什么害处。好的,有一些事情,但它是可管理的
首先,以下两者之间的区别:
using namespace std;
...
cout << "Something" << endl;
当我使用使用namespace std
时,我打开了命名冲突的大门。如果我(偶然)将变量命名为与头中定义的内容相同的内容,那么您的程序将中断,您将很难找出原因
通过不使用语句using namespace std
,我可以编写与以前相同的程序(但可以让它工作):
#include <iostream>
int main(int argc, char** argv) {
int cout = 0;
int endl = 1;
std::cout << cout << endl << std::endl; // Compiler is happy, so I'm happy :)
return 0;
}
#包括
int main(int argc,字符**argv){
int cout=0;
int endl=1;
std::cout好问题,Ryan。使用名称空间
的作用是将给定名称空间(范围)中的所有符号导入到使用该名称空间的范围中。例如,您可以执行以下操作:
namespace A {
struct foo {};
}
namespace B {
using namespace A;
struct bar : foo {};
}
在上面的示例中,名称空间A
中的所有符号在名称空间B
中变得可见,就像在那里声明的一样
此导入仅对给定的转换单元有效。因此,例如,当在实现文件(即.cpp
)中使用命名空间std;
执行操作时,基本上将std
命名空间中的所有符号导入全局范围
您还可以导入某些符号而不是所有符号,例如:
#include <iostream>
#include <iomanip>
int main()
{
using namespace std;
int left = 1, right = 2;
cout << left << " to " << right << "\n";
}
using std::cout;
using std::endl;
您可以在全局范围、命名空间范围或函数范围中执行此操作,如下所示:
int main ()
{
using namespace std;
}
namespace fs = boost::filesystem;
fs::foo ();
fs::bar ();
namespace MyLib {
namespace fs = boost::filesystem;
}
<> P>程序员决定何时使用完全限定名称,何时使用<代码>使用关键字。通常,将<代码>使用到头文件通常是很不好的。专业C++程序员几乎从不这样做,除非在某些问题上工作是必要的,否则他们肯定不会弄乱类型RESOL。不管是谁用这个标题
但是,在源文件内部(没有人包括源文件),只要不同名称空间中没有冲突的名称,就可以使用任何类型的USE语句。这只是一个品味问题。例如,如果代码中使用了大量来自不同名称空间的符号,我希望至少提供一些提示,说明它们实际声明的位置。但是每个人都熟悉STL,所以使用namespace std;
绝不会造成任何伤害
也可能有一些长名称空间,在这些情况下名称空间别名很方便。例如,有一个Boost.Filesystem库,它将所有符号放在Boost::Filesystem
名称空间中。使用该名称空间会太多,所以人们通常会这样做:
int main ()
{
using namespace std;
}
namespace fs = boost::filesystem;
fs::foo ();
fs::bar ();
namespace MyLib {
namespace fs = boost::filesystem;
}
此外,在标题中使用名称空间别名几乎没有问题,如下所示:
int main ()
{
using namespace std;
}
namespace fs = boost::filesystem;
fs::foo ();
fs::bar ();
namespace MyLib {
namespace fs = boost::filesystem;
}
…并从较少的键入中获益。所发生的情况是,将使用此标头的用户不会通过说使用命名空间MyLib;
来导入整个文件系统库。但随后,他们将导入“fs”您库中的命名空间可能与其他内容冲突。因此,最好不要这样做,但如果您太想这样做,则最好在此处使用命名空间boost::filesystem说
回到您的问题。如果您使用C++ I/O流编写一个库,最好不要在标题中使用任何<代码>使用< /COD>语句,我将使用NoStESTSTD;< <代码> >在每个<代码> CPP < /C>文件中。
#include <iostream>
#include <iomanip>
int main()
{
using namespace std;
int left = 1, right = 2;
cout << left << " to " << right << "\n";
}
using std::cout;
using std::endl;
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)
{
// ...
}
如果你要告诉某人不要使用命名空间std使用,那么至少给他一个不应该使用的例子。很明显,他对命名空间比较陌生,所以给他这样盲目的无所不包的建议弊大于利。是吗?它不会伤害任何东西,而且往往会导致更精确的状态考虑到我给出了一个理由——事实上是两个理由,我认为最好给新手一些一般性的指导(而不是“盲目的包罗万象的建议”)