前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasyC++53,using声明vs using编译指令

EasyC++53,using声明vs using编译指令

作者头像
TechFlow-承志
发布2022-08-26 17:21:30
4250
发布2022-08-26 17:21:30
举报
文章被收录于专栏:TechFlow

作者 | 梁唐

大家好,我是梁唐。

这是EasyC++系列的第53篇,继续聊聊using声明和using编译指令。

using 声明 vs using编译指令

使用using编译指令导入一个名称空间中所有的名称与使用多个using声明是不同的。

使用using声明时,就好像声明了相应的名称一样,如果某个名称已经在函数中声明了,则不能使用using声明导入相同的名称。而使用using编译指令时,将进行名称解析。如果函数中已经存在某个声明的名称,那么局部名称将会隐藏名称空间名,就像是隐藏同名的全局变量一样。

这样的文字说明看起来有些拗口,我们来看一个例子:

代码语言:javascript
复制
namespace Jill {
    double bukect(double n) {...}
    double fetch;
    struct Hill {...};
}

char fetch;

int main() {
    using namespace Jill;
    Hill thrill;
    double water = bucket(2);
    double fetch;
    cin >> fetch; // main函数中的fetch
    cin >> ::fetch; // 全局fetch
    cin >> Jill:fetch; // Jill名称空间中的fetch
}

void test() {
    Hill top; // 非法
}

在这段代码当中,名称Jill::fetch被放在局部名称空间中,因此它的作用域不是全局的,因此不会覆盖全局的fetch变量。然而局部声明的fetch将隐藏Jill::fetch和全局的fetch

所以为了进行区分,需要我们在fetch之前加上作用于解析运算符。

还有一点需要注意,虽然我们在main函数中使用了using编译指令,它会将名称空间的名称视为是在函数之外声明的。但它不会使文件中的其他函数也能够使用这些名称,因此我们在test函数当中声明Hill是非法的。

一般来说,使用using声明比使用using编译指令更安全。因为using声明一次只会导入一个名称,如果和局部的名称发生冲突,那么编译器将会检查出冲突并提示。而using编译指令会导入名称空间中所有名称,包括可能并不需要的名称。如果发生了冲突,则会被局部名称覆盖,编译器也不会发出警告。

另外名称空间的名称可能分散在多个地方,也会增加烦恼,导致不知道添加了哪些名称。

C++ Primer中的实例偏好将using namespace std语句放在main函数当中,也有许多人喜欢将它放在全局名称空间中:

代码语言:javascript
复制
#include<iostream>
using namespace std;
int main() {
    return 0;
}

这样做主要是为了方便,但最好不要这样做,还是使用名称空间解析运算符更加妥当:

代码语言:javascript
复制
int x;
std::cin >> x;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • using 声明 vs using编译指令
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档