在实现文件中使用指令
Using Directives in Implementation Files
在C++入门中,有一个提示说:
using
指令有用的一个地方是在实现中 命名空间本身的文件。
我想这只是为了使用速记名称?我不确定它与仅围绕实现有何不同
namespace namespace_name
{
}
谢谢。
这适用于对您自己的命名空间的修改。using
指令的目的是从不同的命名空间导入符号。比如一个臭名昭著的成语:
namespace my_stuff
{
template <typename Container>
void my_fn( Container& xs )
{
using std::begin;
using std::end;
std::sort( begin(xs), end(xs) );
}
}
一切都发生在您的my_namespace
,但如果需要,它会提供std::begin()
和std::end()
功能。如果存在更本地的 begin()
和 end()
定义,并且与容器类型更匹配,则将改用该定义。如果您只是将所有内容包装在 std 命名空间中,那么这种有用的功能就会丢失。
希望这有帮助。
我不确定它与仅用
namespace namespace_name { }
围绕实现有何不同
这是将您自己的代码放在命名空间中,而不是使用另一个命名空间中的某个名称。假设你在 Graphics
命名空间中编写了一个 draw
函数——为此,你将draw
的代码包装在 namespace Math { void draw() { /* some code */ } }
中,并使用它Graphics::draw
。但是,当您需要使用函数(例如,gamma
Math
命名空间(不是您编写的(时,您必须Math::gamma
调用它,以便编译器知道在哪里搜索gamma
。或者,您可以使用速记来删除Math::
部分。
我想这只是为了使用速记名称?
是的,这是为了允许在没有限定符的情况下使用来自某个命名空间的标识符。有两种方法可以做到这一点。
- Using 指令:使用命名空间中的所有名称而不加限定(例如
using namespace Math;
(
使用 - 声明:仅使用一些指定的名称而不加限定(例如
using Math::gamma
( - 这通常比前者更好。
但是,两者都被鼓励只在实现/源文件中使用,而不是在标头中使用,以避免某些源代码可能有自己的gamma
副本并且不想使用Math::gamma
,但由于您在标头中拥有它,它会导致名称冲突。有关 c++ 标头中"使用命名空间"的更多详细信息。
- 如果没有malloc,链表实现将失败
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何在c++中实现处理器调度模拟器
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- C++:对不存在的命名空间使用命名空间指令
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 在实现文件中,我们应该更喜欢"using namespace"指令还是将实现包装在命名空间 { } 中?
- 如何使用C++中的处理器指令来实现快速算术运算
- 确定如何实现OpenMP原子指令
- 为什么无法使用'using'指令实现继承的纯虚拟方法?
- MOV x86指令是否实现C++11 memory_order_release原子存储
- 如何使用 boost::spirit::lex 实现包含指令
- 使用带有自定义对齐分配器实现的最新g++,使用SSE和-O3选项编译时出现非法指令(核心转储)
- 获取释放栅栏的意义不同平台的抽象指令实现
- 在实现文件中使用指令