我有一个 C++ 项目(VC++ 2008),它只在许多源文件中使用 std 命名空间,但我找不到放置“使用命名空间 std;”的“正确”位置。
如果我把它放在 main.cpp 中,它似乎不会传播到我的其他源文件中。当我把它放在头文件中时,我让它工作了,但后来我被告知这很糟糕。如果我将它放在所有 .cpp 文件中,编译器将无法识别 std 命名空间。
这应该怎么做?
我有一个 C++ 项目(VC++ 2008),它只在许多源文件中使用 std 命名空间,但我找不到放置“使用命名空间 std;”的“正确”位置。
如果我把它放在 main.cpp 中,它似乎不会传播到我的其他源文件中。当我把它放在头文件中时,我让它工作了,但后来我被告知这很糟糕。如果我将它放在所有 .cpp 文件中,编译器将无法识别 std 命名空间。
这应该怎么做?
在您的标题中,我认为最好的办法就是完全限定名称空间,例如成员
#include <list>
class CYourClass
{
std::list<int> myListOfInts;
...
};
您可以继续完全符合 cpp 中的任何功能
int CYourClass::foo()
{
std::list<int>::iterator iter = myListOfInts.begin();
...
}
你真的永远不需要在任何地方“使用命名空间标准”。仅当您发现输入 std:: 太多时,才可以输入“使用命名空间 std”以节省您自己的击键并提高代码的可读性。这将仅限于声明的范围。
int CYourClass::foo()
{
using namespace std;
list<int>::iterator iter = myListOfInts.begin();
...
}
您通常有三个可接受的选项:
我认为最普遍接受的最佳实践是使用#1 - 准确显示该方法的来源。
在某些情况下,文件完全依赖于从命名空间中提取内容,因此将 using 命名空间放在源文件的顶部更具可读性。虽然由于懒惰很容易做到这一点,但尽量不要屈服于这种诱惑。至少通过将它放在特定的源文件中,维护代码的人可以看到它。
第三种情况通常是不好的做法。如果您依赖多个外部源文件,这两个文件都可能定义相同的方法,这可能会导致问题。此外,对于维护您的代码的人来说,它会混淆某些声明的来源。应该避免这种情况。
总结: 更喜欢使用范围实例(std::Something),除非过度使用这些实例会降低代码的易读性和可维护性。
您可以将它放在多个位置 - 每个 .cpp 文件中。
本质上,您需要做出选择:
1)通过包含using namespace std
在所有cpp文件中来“做正确的事”,或者
2)添加using namespace std
一些常用的头文件。
不同的人会对哪个最好有不同的看法,但是如果你问我,我会选择放入using namespace std
一个共同的标题。在我看来,std命名空间就是这样 - “标准”,任何名称冲突都需要在代码级别解决,而不是依赖命名空间。
命名空间不会“传播”到其他文件。你必须把它放在每个文件中,或者只是明确地调出你的类。
任何一个:
使用命名空间标准;废话<<x;
或者:
std::blah << x;
选择是一种风格选择,要么在实践中有效。
如果编译器没有“识别”命名空间,那是因为您没有包含声明它的定义文件(即 include )
using namespace std;
仅仅因为这样做对您来说似乎很方便,所以散布代码并不是一个好主意。但是,如果您坚持这样做,您可以将自己的代码包装到该名称空间中。并且只有在稍后您将真正使用主文件中的函数/类时,您才会定义 using namespace std;
. 只是为了强调我的意思,这里的例子:
namespace std
{
class MyNewClass
{
public:
MyNewClass( ) { out << "Hello there" << endl;};
};
};
int main( )
{
std::MyNewClass tmp;
};