我在C ++中使用'using'声明将std :: string和std :: vector添加到本地命名空间(以节省输入不必要的'std ::')。
using std::string;
using std::vector;
class Foo { /*...*/ };
此声明的范围是什么?如果我在标题中执行此操作,是否会将这些“using”声明注入到包含标题的每个cpp文件中?
答案 0 :(得分:102)
头文件没有什么特别之处可以保留using
声明。在编译开始之前,这是一个简单的文本替换。
您可以将using
声明限制为范围:
void myFunction()
{
using namespace std; // only applies to the function's scope
vector<int> myVector;
}
答案 1 :(得分:56)
当您在C ++中#include一个头文件时,它会将头文件的全部内容放入您在源文件中包含它的位置。因此,包含具有using
声明的文件具有将using
声明放在包含该头文件的每个文件顶部的完全相同的效果。
答案 2 :(得分:48)
using语句的范围取决于它在代码中的位置:
答案 3 :(得分:7)
范围是使用声明所在的任何范围。
如果这是全球范围,那么它将处于全球范围。如果它位于头文件的全局范围内,那么它将位于包含头的每个源文件的全局范围内。
因此,一般建议是避免在头文件的全局范围内使用声明。
答案 4 :(得分:6)
在引用的案例中,文件(“翻译单位”),表示是,包含它的每个文件。
您也可以将using语句放在类中,在这种情况下,它只对该类有效。
通常,如果需要在标头中指定命名空间,通常最好只对每个必需的标识符进行完全限定。
答案 5 :(得分:2)
这是正确的。范围是使用using
声明的模块。如果模块包含的任何头文件具有using
声明,则这些声明的范围将是该模块,以及包含相同标头的任何其他模块。
答案 6 :(得分:0)
当他们说“不要”时,有一些评论相当不合格。这太严厉了,但你必须明白什么时候可以。
写using std::string
永远不行。在您自己的头文件中编写using ImplementationDetail::Foo
,当该头部声明ImplementationDetail :: Foo时可以正常,如果在您的命名空间中发生using声明。 E.g。
namespace MyNS {
namespace ImplementationDetail {
int Foo;
}
using ImplementationDetail::Foo;
}
答案 7 :(得分:0)
已编辑:
作为附加信息,当语句位于“#include 之前” 时,将“using”放在源文件中会影响您的标题。 (使用范围不向后延伸)
header.h
//header.h
#include <string>
std::string t1; // ok
string t2; // ok
header.cpp
//header.cpp
using namespace std ;
#include "header.h"
...