朝鲜世界杯_2019篮球世界杯 - dyldrk.com

05、C++ namespace与using详解 - 命名空间与类型别名

本文主要介绍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 a = 1;

meowllong b = 2;

MeowFrameMap m;

比如**using 美国总统 = 拜登**,就是给拜登起了个别名叫美国总统,以后叫美国总统的时候别人也知道就是叫的拜登。

using非常方便,比如有一个很复杂的std::map,每次使用std::map定义变量就非常麻烦,

而有了using,就可以使用MeowFrameMap,方便快捷,表示的含义也很清晰。