基础语法
命名空间别名:给已有命名空间起一个简短别名
cpp
namespace 别名 = 原命名空间名;
示例:
cpp
namespace VeryLongNamespaceName{
int a = 1;
}
// 起别名
namespace Short = VeryLongNamespaceName;
调用:Short::a,等价于VeryLongNamespaceName::a
关键特性
- 不可变性:别名定义后,不能重新绑定到其他命名空间
- 完全访问:别名可以访问原命名空间内全部成员,权限完全一致
- 原名别名共存:原命名空间名 和 别名可以同时使用,二者等价
cpp
namespace CC{ int a; }
namespace CC_STD = CC;
CC::a = 1;
CC_STD::a = 2; // 修改的是同一个变量
注意事项
- 创建命名空间别名只能用namespace关键字
○ ❌ using、typedef 不能创建命名空间别名
○ using:引入命名空间成员 / 类型别名
○ typedef:仅用于类型别名 - 别名有作用域:可以写在全局、局部(函数内),仅在当前作用域生效
cpp
void test()
{
namespace Short = VeryLongNamespaceName; // 局部别名,仅函数内可用
}
使用场景 & 最佳实践
✅适用场景
- 第三方库超长命名空间,简化书写
- 项目重构,替换命名空间时,保留旧代码兼容
- 快速切换不同版本命名空间
✅最佳实践 - 别名名字要有语义,不要随便简写
- 不要大量滥用别名,避免阅读代码时分不清原名
- 团队统一别名规范
概念区分
| 特性 | 命名空间别名 namespace A = B |
using 声明 using std::cout |
typedef | using 类型别名 using T = int |
|---|---|---|---|---|
| 作用 | 给整个命名空间起新名字 | 引入命名空间中单个成员 | 给数据类型起别名 | C++11 类型别名 |
| 对象 | 命名空间 | 变量 / 函数 / 类型 | 类型 | 类型 |
完整演示代码
cpp
#include <iostream>
namespace VeryLongNameSpaceDemo
{
void print()
{
std::cout << "命名空间别名测试\n";
}
}
// 定义别名
namespace ShortDemo = VeryLongNameSpaceDemo;
int main()
{
VeryLongNameSpaceDemo::print();
ShortDemo::print(); // 等价调用
return 0;
}
总结
- 命名空间别名不是新建命名空间,只是原命名空间的另一个名字
- 原名、别名同时有效,操作同一份实体
- 命名空间别名语法:namespace 别名 = 原名;
- 和 using 完全不同:using 是把名字引入当前作用域;命名空间别名是给整个命名空间换简称