本文主要介绍namespace
和using
。
什么是namespace
?
namespace
是指命名空间,表示某个变量标识符的可见空间,比如下面的代码:
namespace Meow {
int k = 100;
}
int main() {
std::cout << k << std::endl;
}
这段代码中在命名空间Meow
中定义了变量k
,表示变量k
只有在命名空间Meow
中才可见。
所以下面直接访问k
这种情况,编译器会报错:
test.cc:9:18: error: use of undeclared identifier 'k'; did you mean 'Meow::k'?
std::cout << k << std::endl;
^
Meow::k
test.cc:5:9: note: 'Meow::k' declared here
int k = 100;
^
1 error generate
那怎么才能访问到这个k
?
需要显式声明使用某个命名空间的k
,比如:
std::cout << Meow::k << std::endl;
还有一种方法访问到k
,就是把它整体包含到对应的namespace
中:
namespace Meow {
int k = 100;
void f() {
std::cout << k << std::endl;
}
}
等等,还有一种方法,利用using
,可以提前声明好使用哪个namespace
:
using namespace Meow;
void f() {
std::cout << k << std::endl;
}
这段代码就提前声明了使用Meow
的namespace
,这样在访问k时就会默认去Meow
的namespace
里寻找,编译器也就不会报错了。
我们经常见到的using namespace std
就是这个作用。
另外namespace
可以嵌套,比如:
namespace A {
namespace B {
int k = 100;
}
}
int main() {
std::cout << A::B::k;
}
也可以这样嵌套:
namespace A::B {
int k = 100;
}
两种嵌套的使用方法相同。
那为什么要引入namespace
?
在大的项目工程里,有好多个程序员,不可避免的会定义相同名字的函数,比如Print
就可能会定义好多次,但一个工程中,同名函数定义多次就会报错,所以才引入了namespace
,把不同模块里的函数用不同的namespace
包裹起来,就避免了multi definition
的报错。
using的作用?
前面简单介绍了using
的使用,其实using
还有另一个作用,就是起别名:
using meowint = int;
using meowllong = long long;
using MeowFrameMap = std::map<meowint, Frame>;
meowint a = 1;
meowllong b = 2;
MeowFrameMap m;
比如using 美国总统 = 拜登
,就是给拜登起了个别名叫美国总统,以后叫美国总统的时候别人也知道就是叫的拜登。
using
非常方便,比如有一个很复杂的std::map<meowint, Frame>
,每次使用std::map<meowint, Frame>
定义变量就非常麻烦,而有了using
,就可以使用MeowFrameMap
,方便快捷,表示的含义也很清晰。
作者介绍
- 程序喵大人
- 35- 资深C/C++/Rust/Android/iOS客户端开发
- 10年大厂工作经验
- 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
- 《C++20高级编程》《C++23高级编程》等多本书籍著译者
C++训练营
专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得offer!训练营介绍