C++ 使用「;使用;在头文件中
我明白,我不应该在头文件中使用此选项:C++ 使用「;使用;在头文件中,c++,namespaces,using,C++,Namespaces,Using,我明白,我不应该在头文件中使用此选项: using namespace foo; 因为它为使用我的头文件的任何人将名称空间foo引入全局范围 如果我在自己的命名空间中这样做,我可以防止这种情况发生吗?例如: namespace my_lib { using namespace foo; // my stuff // ... } 现在,使用名称空间foo应该限制在名称空间my_lib的范围内,对吗?是。这比在全局级别使用名称空间foo要好 如果使用foo::name语
using namespace foo;
因为它为使用我的头文件的任何人将名称空间foo引入全局范围
如果我在自己的命名空间中这样做,我可以防止这种情况发生吗?例如:
namespace my_lib
{
using namespace foo;
// my stuff
// ...
}
现在,使用名称空间foo应该限制在名称空间my_lib的范围内,对吗?是。这比在全局级别使用
名称空间foo
要好
如果使用foo::name
语法,效果会更好
现在,使用名称空间foo应该限制在名称空间my_lib的范围内,对吗
对。它带来了命名空间
my_lib
中命名空间foo
中的所有名称,这可能会导致my_lib
中的名称冲突。这就是为什么foo::name
是最受欢迎的方法。是的,如果你这样做,那么它只会将foo
中的所有名称带入my_lib
——正如其他人所指出的,这可能是可取的,也可能是不可取的
除了其他人所说的之外,我还要注意的一件事是,您可以使用“名称空间内的using指令”的思想来模拟限制在类范围内的using指令。请注意,这是非法的:
class C
{
using namespace boost; // for example
// ...
};
但你可以这样做:
namespace C_Namespace {
using namespace boost;
class C
{
};
}
using C_Namespace::C; // bring C itself back into the global namespace
我想如果您真正想要的是能够定义某些东西(比如类),而不必一直编写特定的名称空间前缀,那么您可能会发现它很有用。请注意,这会将名称空间
foo
的全部内容拖到名称空间my_lib
。这真的是你想要的吗?这可能比污染全局名称空间要好,但您仍然在污染名称空间……您只是想缩短名称空间吗?在这种情况下,您需要的不是foo::bar::box::action()
而是my_lib::action()
名称空间别名namespace my_lib=foo::bar::box代码>我不同意始终使用完整名称空间名称是合适的。别名和在作用域中引入名称大大简化了代码。如果my_lib
的用户几乎总是需要同时使用foo
,那么组合他们的作用域是有意义的。@edA-qa-mort-ora-y:如果存在名称冲突呢?另外,my_lib
可能引用其他十几个名称空间中的其他名称,那么这是否意味着它应该对所有名称空间使用using namespace xyz
?我也赞成将名称纳入范围,因为这样可以使生成的代码更易于阅读。但是,有一些方法没有任何主要的缺点(例如,见下文)。冲突总是可能的,但我不认为它们的可能性会阻止您导入名称。如果一个名称空间要在另一个名称空间上分层,您只需避免冲突。如果两个名称空间完全不相关,则可能不应该导入名称。@edA qa mort-ora-y:您的评论并没有真正解决名称冲突的问题。正如我所说的,如果发生名称冲突怎么办?此外,将包含函数的多个名称引入范围可能会产生ADL和其他名称查找问题,这可能会产生意外的函数解析,等等!