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

我使用 C + + 中的‘ using’声明将 std: : string 和 std: : Vector 添加到本地名称空间(以避免输入不必要的‘ std: :’s)。

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


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

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

57855 次浏览

在引用的例子中,文件(“翻译单元”) ,意思是是的,包含它的每个文件。

您还可以将 using 语句放在类中,在这种情况下,它只对该类有效。

Generally, if you need to specify a namespace in a header, it's often best to just fully-qualify every identifier necessary.

没错。范围是使用 using声明的模块。如果模块包含的任何头文件具有 using声明,那么这些声明的作用域将是该模块,以及包含相同头文件的任何其他模块。

当您在 C + + 中包含一个头文件时,它会将头文件的全部内容放在您将其包含在源文件中的位置。因此,包含具有 using声明的文件与将 using声明放在包含该头文件的每个文件的顶部具有完全相同的效果。

头文件没有什么特别之处可以阻止 using声明。这只是编译开始前的一个简单文本替换。

您可以将 using声明限制在一个范围内:

void myFunction()
{
using namespace std; // only applies to the function's scope
vector<int> myVector;
}

作用域是 using 声明所在的任何作用域。

If this is global scope, then it will be at global scope. If it is in global scope of a header file, then it will be in the global scope of every source file that includes the header.

因此,一般的建议是 avoid using declarations in global scope of header files

Using 语句的范围取决于它在代码中的位置:

  • 放置在文件的顶部,它在整个文件中都有作用域。
  • 如果这是一个头文件,它将在包含该头文件的所有文件中具有作用域。一般来说,这是“ 不是个好主意”,因为它可能有意想不到的副作用
  • 否则,使用语句在包含它的块内具有从出现到块末尾的作用域。如果它放置在一个方法中,它将在该方法中具有作用域。如果它放置在类定义中,那么它将在该类中具有作用域。

当他们说“不要”的时候,有一些评论是相当不合格的。这太严厉了,但是你必须明白什么时候可以。

编写 using std::string从来都不是件好事。在您自己的头部中编写 using ImplementationDetail::Foo,当这个头部声明 implementationDetail: : Foo 时可以是 OK 的,更何况如果使用声明发生在您的名称空间中。例如。

namespace MyNS {
namespace ImplementationDetail {
int Foo;
}
using ImplementationDetail::Foo;
}

编辑:

作为附加信息,在源文件中放置“ using”将在语句放置 “在 # 包括之前”时影响头部。(使用 不会向后延伸的范围)

标题

//header.h
#include <string>


std::string t1; // ok
string t2; // ok

Header.cpp

//header.cpp
using namespace std ;


#include "header.h"


...