在学习cartographer算法时总能看到如下类似的代码:
namespace cartographer_ros {
namespace carto = ::cartographer;
using carto::transform::Rigid3d;
namespace {
const std::string& CheckNoLeadingSlash(const std::string& frame_id) {
if (frame_id.size() > 0) {
CHECK_NE(frame_id[0], '/') << "The frame_id " << frame_id
<< " should not start with a /. See 1.7 in "
"http://wiki.ros.org/tf2/Migration.";
}
return frame_id;
}
}
这篇文章主要对命名空间的一些应用进行学习,namespace是C++中的关键字,而cartographer_ros是标准库所在空间的名称。在我们申明了该命名空间后,我们就可以调用空间下的东西。
所谓命名空间,是一种将程序库名称封装起来的方法,可以避免导致全局命名冲突问题。因为随着C++的不断发展,关键字和变量越来越多,在工程中使用有遇到重命名的问题越来越多,所以引入了命名空间,让每一个即使是同名的变量都可以辨识。下面介绍主要的几种用法:
一.直接访问
namespace test
{
int x=100;
void Rigid3d
{
cout << "using namespace" <<endl;
}
}
int main()
{
cout << test::x <<endl;
test::Rigid3d();
}
上述代码就是直接通过域作用符直接访问命名空间中的变量等。
二.using声明
namespace test
{
int x=100;
void Rigid3d
{
cout << "using namespace" <<endl;
}
}
int main()
{
using test::x;
cout << x << endl;
using test::Rigid3d();
Rigid3d();
}
使用using声明后的x变量以及Rigid3d只能在当前函数作用域中使用,也可以如下所述,直接编译整个命名空间,这样这个空间下的所有符号在这个作用域下都可用,最开始的代码using carto::transform::Rigid3d 也是同理。
int main()
{
using namespace test;
cout << x << endl;
Rigid3d();
}
除此之外也可以通过下述操作进行简化:
namespace carto = ::cartographer;
using carto::transform::Rigid3d;