当前位置: 首页 > news >正文

【C++】 using声明 与 using指示

在 C++ 中,using 关键字有两种主要用法:using 声明(using declaration)using 指示(using directive)。它们的作用不同,适用范围也不同。


1. using 声明(using declaration)

作用:将某个命名空间中的单个名字引入当前作用域,使其可以直接使用,而无需加命名空间前缀。
语法

using 命名空间::成员名;

示例

#include <iostream>namespace MyNS {void foo() { std::cout << "MyNS::foo()\n"; }void bar() { std::cout << "MyNS::bar()\n"; }
}int main() {using MyNS::foo;  // 仅引入 foo,不引入 barfoo();            // 可以直接调用,无需 MyNS::// bar();         // 错误:bar 未引入,必须写 MyNS::bar()return 0;
}

特点

  • 只引入指定的成员,不会引入整个命名空间。
  • 作用域限定在当前代码块(如函数、类、命名空间)。
  • 可以避免命名冲突,因为只引入需要的名字。

2. using 指示(using directive)

作用:将整个命名空间的所有成员引入当前作用域,使所有成员都可以直接访问。
语法

using namespace 命名空间;

示例

#include <iostream>namespace MyNS {void foo() { std::cout << "MyNS::foo()\n"; }void bar() { std::cout << "MyNS::bar()\n"; }
}int main() {using namespace MyNS;  // 引入整个 MyNS 命名空间foo();                 // 可以直接调用bar();                 // 也可以直接调用return 0;
}

特点

  • 引入整个命名空间的所有成员,可能导致命名冲突。
  • 作用域是整个当前代码块(如函数、类、命名空间)。
  • 在头文件中避免使用,因为它会影响所有包含该头文件的代码。

关键区别

特性using 声明 (using NS::name;)using 指示 (using namespace NS;)
引入范围仅引入指定的成员引入整个命名空间的所有成员
命名冲突风险低(只引入需要的名字)高(可能引入不需要的名字)
推荐使用场景局部作用域(如函数、类内部)小型项目或局部作用域(避免全局使用)
在头文件中的使用较安全(可控)不推荐(可能污染全局命名空间)

最佳实践

  1. 优先使用 using 声明using std::cout;),因为它更安全,只引入需要的名字。
  2. 避免在头文件使用 using namespace,防止命名空间污染。
  3. 在实现文件(.cpp)中,可以局部使用 using namespace,但尽量限制作用域。

示例(推荐做法)

// 头文件(避免 using namespace!)
#include <iostream>// 使用 using 声明,只引入需要的名字
using std::cout;
using std::endl;void printMessage() {cout << "Hello" << endl;  // 安全,不会引入整个 std
}
// 源文件(可以谨慎使用 using namespace)
#include <vector>
using namespace std;  // 在局部作用域使用(如函数内部)void foo() {vector<int> v;  // 可以直接用,因为 using namespace std
}

总结

  • using 声明:精确引入某个名字,安全可控,推荐使用。
  • using 指示:引入整个命名空间,可能导致冲突,谨慎使用(避免在头文件中使用)。
http://www.xdnf.cn/news/1321651.html

相关文章:

  • Linux内存管理系统性总结
  • Orange的运维学习日记--45.Ansible进阶之文件部署
  • 获粤港澳大湾区碳足迹认证:遨游智能三防手机赋能绿色通信
  • LeetCode:无重复字符的最长子串
  • 实践笔记-VSCode与IDE同步问题解决指南;程序总是进入中断服务程序。
  • LAMP 架构部署:Linux+Apache+MariaDB+PHP
  • 规避(EDR)安全检测--避免二进制文件落地
  • 云计算- KubeVirt 实操指南:VM 创建 、存储挂载、快照、VMI全流程 | 容器到虚拟机(镜像转换/资源调度)
  • 前端处理导出PDF。Vue导出pdf
  • 王树森深度强化学习DRL(三)围棋AlphaGo+蒙特卡洛
  • STRIDE威胁模型
  • 新手向:Java方向讲解
  • Python实战--基于Django的企业资源管理系统
  • 块体不锈钢上的光栅耦合表面等离子体共振的复现
  • 后端通用基础代码
  • 在嵌入式单片机开发中,通过校验和或者校验码来比对程序版本好有何优劣势
  • 【OLAP】trino安装和基本使用
  • 【完整源码+数据集+部署教程】无人机目标检测系统源码和数据集:改进yolo11-efficientViT
  • Linux网络服务(一)——计算机网络参考模型与子网划分
  • Linux bash核心介绍及目录命令
  • Android中使用RxJava实现网络请求与缓存策略
  • Git-2025-0818
  • 数据结构:查找表
  • 开源im即时通讯软件开发社交系统全解析:安全可控、功能全面的社交解决方案
  • 从零到GPT:Transformer如何引领大模型时代
  • Nextcloud 私有云部署:cpolar 内网穿透服务实现安全远程文件访问
  • 4G高负荷解决方案
  • 《红色脉-络:一部PLMN在中国的演进史诗 (1G-6G)》 第6篇 | 专题:核心网的第一次革命——从电路交换到“用户/控制面分离”
  • python-----机器学习中常用的数据预处理
  • 英特尔公司Darren Pulsipher 博士:以架构之力推动政府数字化转型