# 命名空间方法的使用

#

# include <iostream>
using namespace std;

引入命名域,如果没有引入命名域,则在 cout 以及 cin 都需要写成
std::cout
std::cin‘

命名空间的作用

首先我们知道 C++ 是一个支持面向对象开发的语言,那么在类的定义的时候,我们需要抽象出物体(这一类物体的属性),但是实际情况下,不同类的物品在抽象的时候,可能会有相同定义的属性,比如在游戏当中,玩家有血量 HP ,敌人同样也有血量 HP,那如果定义变量的时候都定义 HP ,将会产生冲突,命名空间就很好地解决了这一点。

如下:

namespace Player
{
    float hp;
}
namespace Enemy
{
	float hp;
}

int main
{
	Player::hp;
	Enemy::hp;
	return 0;
}

在上述例子中,我分别创建了两个命名空间 “ Player ”,“ Enemy ”, 我在调用他们的时候都必须要在变量前面提前使用作用域限定符号 ==::==。

如此如做就对变量进行了很好地区分。同时比起直接该变量名去解决冲突,也提高了可读性和易维护性。

# 一些奇怪的问题

Q(imcenyi): 那如果有两个全局命名空间比如 a,b, 这两个命名空间下都有变量 num,那如果我在一个程序中,声明了两个命名空间 a,b,这个时候我调用 num 的时候,会发生什么,会报错吗

A(GitHub Copilot): 如果在一个程序中声明了两个命名空间 ab ,并且这两个命名空间下都有变量 num ,那么在调用 num 变量时,编译器会根据作用域规则来确定使用哪个命名空间下的 num 变量。

具体来说,如果在某个作用域中使用了 num 变量,编译器会按照以下顺序查找 num 变量:

  1. 查找当前作用域中是否有名为 num 的变量,如果有,则使用该变量。
  2. 如果当前作用域中没有名为 num 的变量,则查找最近的外层作用域中是否有名为 num 的变量,如果有,则使用该变量。
  3. 如果所有外层作用域中都没有名为 num 的变量,则查找命名空间 a 中是否有名为 num 的变量,如果有,则使用该变量。
  4. 如果命名空间 a 中没有名为 num 的变量,则查找命名空间 b 中是否有名为 num 的变量,如果有,则使用该变量。
  5. 如果命名空间 b 中也没有名为 num 的变量,则编译器会报错。

因此,如果在程序中声明了两个命名空间 ab ,并且这两个命名空间下都有变量 num ,那么在调用 num 变量时,编译器会根据作用域规则来确定使用哪个命名空间下的 num 变量,不会报错。但是,为了避免命名冲突,建议在程序中尽量避免使用相同的变量名。

希望这可以帮助到你!

# C++ 完全兼容 C

同样 C++ 也完全兼容 C 的全部源文件 但是要再.h 文件名前加 C,如:

# include <cstdio.h>

# 定义命名空间 namespace

namespace
{
...;
}