当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C++中"使用"声明的范围是什么?》经验,为你挑选了5个好方法。

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

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

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

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



1> Eclipse..:

头文件没有什么特别之处可以保留using声明.在编译开始之前,这是一个简单的文本替换.

您可以将using声明限制为范围:

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


我从未想过我可以在功能中使用它!

2> Jeremy Ruten..:

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


......这通常是一件坏事.
但是如果你把`using`声明放在`命名空间'里面,它只限于那个命名空间的范围,所以一般都可以(通常需要注意你的特殊需求和风格).

3> dagorym..:

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

放置在文件的顶部,它在整个文件中具有范围.

如果这是一个头文件,它将在包含该头的所有文件中具有范围.一般来说,这是" 不是一个好主意 ",因为它可能会产生意想不到的副作用

否则,using语句在块中具有范围,包含它从块发生到块结束的点.如果它放在方法中,它将具有该方法中的范围.如果它放在类定义中,它将在该类中具有范围.


我认为在类范围内添加`using`语句是不可能的......?我有与OP相同的问题,因为我想避免在整个地方输入`std ::`.我得到的类使用了很多带有智能指针的向量,并且五个字符`std ::`前缀增加了很多行长度 - 我发现它读得更糟.所以我想知道包含该类的命名空间中的`using`指令是否正常?(即使在标题内.)
如果将它放在`namespace {...}`的范围内呢?

4> JohnMcG..:

范围是使用声明所在的任何范围.

如果这是全球范围,那么它将处于全球范围.如果它位于头文件的全局范围内,则它将位于包含头的每个源文件的全局范围内.

因此,一般建议是避免在头文件的全局范围内使用声明.


那还不够强大.用不要替换避免

5> James Curran..:

在引用的案例中,文件("翻译单元"),即,包含它的每个文件,表示是.

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

通常,如果需要在标头中指定命名空间,通常最好只对每个必需的标识符进行完全限定.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有