什么';“的范围是什么?”;使用;C+中的声明+;? 我使用C++中的“使用”声明来添加STD::String和STD::vector到本地命名空间(以保存不必要的“STD:::\”)。
这个声明的范围是什么?如果我在标题中这样做,它会将这些“使用”声明注入到包含标题的每个cpp文件中吗?在所引用的案例中,是文件(“翻译单元”),意思是“是”,包含标题的每个文件 您还可以将using语句放在类中,在这种情况下,它只对该类有效什么';“的范围是什么?”;使用;C+中的声明+;? 我使用C++中的“使用”声明来添加STD::String和STD::vector到本地命名空间(以保存不必要的“STD:::\”)。,c++,C++,这个声明的范围是什么?如果我在标题中这样做,它会将这些“使用”声明注入到包含标题的每个cpp文件中吗?在所引用的案例中,是文件(“翻译单元”),意思是“是”,包含标题的每个文件 您还可以将using语句放在类中,在这种情况下,它只对该类有效 通常,如果需要在头中指定名称空间,通常最好只完全限定每个必要的标识符 没错。作用域是使用using声明的模块。如果模块中包含的任何头文件都使用声明,则这些声明的范围将是该模块,以及包含相同标题的任何其他模块。 < P>当您在C++中包含头文件时,它将头文件的
通常,如果需要在头中指定名称空间,通常最好只完全限定每个必要的标识符 没错。作用域是使用
using
声明的模块。如果模块中包含的任何头文件都使用声明,则这些声明的范围将是该模块,以及包含相同标题的任何其他模块。 < P>当您在C++中包含头文件时,它将头文件的全部内容放入源文件中包含的位置。因此,包含一个带有using
声明的文件,其效果与将using
声明放在包含该头文件的每个文件的顶部完全相同。头文件没有什么特殊之处,可以保留using
声明。在编译开始之前,它只是一个简单的文本替换
您可以使用声明将限制为一个范围:
void myFunction()
{
using namespace std; // only applies to the function's scope
vector<int> myVector;
}
void myFunction()
{
使用命名空间std;//仅适用于函数的作用域
向量myVector;
}
范围是使用声明所在的任何范围
如果这是全局范围,那么它将位于全局范围。如果它位于头文件的全局范围内,则它将位于包含头文件的每个源文件的全局范围内
因此,一般建议是避免在头文件的全局范围内使用声明using语句的范围取决于它在代码中的位置:
- 它位于文件的顶部,在整个文件中都有作用域
- 如果这是一个头文件,它将在包含该头文件的所有文件中具有作用域。一般来说,这“不是一个好主意”,因为它可能会产生意想不到的副作用
- 否则,using语句的作用域在包含它的块中,从它出现的点到块的末尾。如果它被放置在一个方法中,它将在该方法中具有作用域。如果它被放置在类定义中,它将在该类中具有作用域
有一些评论在说“不要”时是相当无保留的。这太严厉了,但你必须明白什么时候可以
使用std::string编写
永远都不好。在您自己的头中使用ImplementationDetail::Foo编写,当该头声明ImplementationDetail::Foo时就可以了,如果使用声明发生在您的命名空间中,则更是如此。例如
namespace MyNS {
namespace ImplementationDetail {
int Foo;
}
using ImplementationDetail::Foo;
}
那还不够强壮。用“不”取代“避免”,但“避免”比“不”强。“避免撞到其他车”。。。这通常是一件坏事。但是如果您将using
声明放在名称空间中,则它仅限于该名称空间的范围,因此通常是可以的(通常针对您的特定需求和样式提出警告)…但是如果您将using放在名称空间中,确保您这样做不是为了绕过通常是个坏主意的东西,比如您不能将在命名空间Y之外声明的类方法封装到另一个命名空间X中,这样您就可以在本地使用命名空间X。这就是为什么我们首先要使用namespace::Resolver。如果键入的问题那么大,无论是宏(很容易导致代码气味)还是更好,请将其隔离到它自己的source.cpp中,在那里您将只使用名称空间。虽然这和类似的答案都是很好的建议,他们没有回答这个问题。然后标题的用户可以编写MyNS::Foo
一个更好的例子是使用boost::posix_time::ptime
。当然,用户可以编写MyNS::ptime
,但这还不是世界末日,而且可能会被能够拥有MyFunction(ptime a,ptime b)
之类的函数的便利性所抵消。为什么使用std::string
永远都不行?即使在您自己的名称空间中也可以保存大量的std::
前缀?@thomtom将其包装在您自己的名称空间这样的范围内也可以。以防其他答案不清楚:-不要将using
声明(或using
指令)放在include文件/头的文件范围内!这将给头的用户带来麻烦。事实上,不要在头中使用声明(fortiori指令),即使是在名称空间中!看看这会导致什么问题。@NilsvonBarth:这有点过于简单了。关于所讨论的问题,在类和函数范围内使用是安全的。您可能有兴趣了解该功能。请注意,在类中使用声明与在类外声明的行为方式不同-例如,您不能使用它将cout
而不是std::cout
带入类。我认为在类范围内使用
语句添加是不可能的?因为我想避免到处输入std::
,所以我的问题与OP相同。我得到的类使用了很多带有智能指针的向量,并且五个字符的std::
前缀增加了很多行长度,我发现读起来更糟。所以我想知道在包含类的名称空间中使用指令是否可以?(即使在头中。)如果它被放置在名称空间{…}
的范围内呢?这样您就可以完全编写:{using}
namespace MyNS {
namespace ImplementationDetail {
int Foo;
}
using ImplementationDetail::Foo;
}