Learning C++ 之1.8a 命名冲突和std空间

假如你第一次开车去你朋友家,朋友给了你一个地址:205 Front Streat in Mill City。直到到了Mill City,你打开地图发现有两个205 Front Streat,这个时候就不知道到哪里去了。除非有一些其他的信息来帮你辅助定位。因此你需要打电话给你的朋友问一些详细的信息。因为这样经常会引起歧义,所以一般在一个城市里,不会有两条重名的路。

通常来说,C++要求标识符不能有歧义。如果两个在同一个程序中的名字标识符是相同的,那么程序编译器会上报error,通常叫做命名冲突错误。

一个命名冲突的例子:

a.cpp

#include <iostream>
 
void doSomething(int x)
{
    std::cout << x;
}

b.cpp

#include <iostream>
 
void doSomething(int x)
{
    std::cout << x * 2;
}

main.cpp

void doSomething(int x); // forward declaration for doSomething
 
int main()
{
    doSomething(5);
 
    return 0;
}

a.cpp和main.cpp,或者b.cpp和main.cpp单独编译都不会出现问题。但是假如这三个文件在一个项目中,就会出现命名冲突的问题。

大多数命名冲突发生在两个案例中:

1.两个有相同函数名的文件加载到了一个项目中

2.一个代码文件中包含一个头文件,头文件中的标识符和其他文件冲突(后面我们会讨论头文件)

伴随着程序越来越大,我们的标识符重名的概率会越来越高。好消息是C++提供了大量的工具来避免这种错误。如局部范围,在局部范围内标识符才有效,因此局部范围外可以重名。命名空间,后面会详细介绍。

命名空间:

C++最初设计的时候,所有C++标识符都可以直接使用如Cout,cin等,这也就意味着所有的C++定义的标识符和你自己明明的标识符可能会重名。当你inlude一个标准库的头文件的时候,代码会突然报命名冲突的错误。或者代码在之后的升级版本中会有冲突,所以C++把所有标准库里的函数功能移植到了一个叫做命名空间的地方。

就像一个城市确保自己的道路都是唯一的一样,命名空间保证了C++的标识符在该命名空间里是唯一的。这就放置了命名空间里的标识符发生重命名的问题。

就像std::cout的真正的名字并不是std::cout,而是cout,std是该标识符的命名空间的名字。C++标准库中的所有功能性表示都命名在std空间里,这样我们就不用担心我们自己的标识符命名和标准库里的命名冲突了。

关于命名空间的问题我们会在后面详细介绍,并教你怎么创建自己的命名空间。现在你只需要知道std::cout指的是C++标准函数中的库的命名空间就可以了。我们需要告诉编译器标识符在哪个命名空间里。

显示的使用命名空间:

最直接的使用命名空间的方式就是在标识符前加上前缀如:

   std::cout << "Hello world!";
这是最安全的方式,因为使用起来没有歧义。C++提供了其他方式来使用命名空间,这个会在4.3C 使用声明中介绍
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值