C ++中“使用”声明的范围是什么?

时间:2008-10-21 18:52:28

标签: c++

我在C ++中使用'using'声明将std :: string和std :: vector添加到本地命名空间(以节省输入不必要的'std ::')。

using std::string;
using std::vector;

class Foo { /*...*/ };

此声明的范围是什么?如果我在标题中执行此操作,是否会将这些“using”声明注入到包含标题的每个cpp文件中?

8 个答案:

答案 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语句的范围取决于它在代码中的位置:

  • 放置在文件的顶部,它在整个文件中都有范围。
  • 如果这是一个头文件,它将在包含该头的所有文件中具有范围。一般来说,这是“不是一个好主意”,因为它可能会产生意想不到的副作用
  • 否则, 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"

...