当前位置: 首页 > 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.lryc.cn/news/624580.html

相关文章:

  • 云原生Ansible渗透场景(⾃动化的运维⼯具)
  • Netty架构与组成
  • 45 C++ STL模板库14-容器6-容器适配器-优先队列(priority_queue)
  • 贪心算法(Greedy Algorithm)详解
  • 【C语言】gets和getchar的区别
  • 深度优先遍历dfs(模板)
  • 具身智能2硬件架构(人形机器人)摘自Openloong社区
  • 数据结构:查找表
  • 宏观认识 Unitree LiDAR L1 及其在自动驾驶中的应用
  • 【opencv-Python学习日记(7):图像平滑处理】
  • 阿里云odps和dataworks的区别
  • Poisson分布:稀有事件建模的理论基石与演进
  • 前端纯JS实现手绘地图 地图导引
  • YAML 语法结构速查表(完整版)
  • 【tips】unsafe-eval线上页面突然空白
  • Lucene 8.5.0 的 `.pos` 文件**逻辑结构**
  • 永磁同步电机控制算法--转速环电流环超螺旋滑模控制器STASMC
  • 大数据毕业设计选题推荐:基于Hadoop+Spark的城镇居民食品消费分析系统源码
  • 【项目】分布式Json-RPC框架 - 项目介绍与前置知识准备
  • 将 iPhone 联系人转移到 Infinix 的完整指南
  • Zephyr下ESP32S3开发环境搭建(Linux篇)
  • 【Python语法基础学习笔记】常量变量运算符函数
  • 分布式系统的“不可能三角”:CAP定理深度解析
  • flask——4:请求与响应
  • 敏感数据加密平台设计实战:如何为你的系统打造安全“保险柜”
  • 实战演练:通过API获取商品详情并展示
  • pytest的前置与后置
  • 【笔记ing】考试脑科学 脑科学中的高效记忆法
  • c++26新功能—可观测检查点
  • 晨控CK-GW08S与欧姆龙PLC配置Ethernet/IP通讯连接手册