目录
1.引例
2.命名空间的定义
3.命名空间的使用
4.命名空间使用注意事项
正文
1.引例
#include <stdio.h> #include <stdlib.h> int rand = 10; int main() { printf("%d\n", rand); return 0; }
当我们用C语言写下这样的代码,看着并没有什么语法问题,但是当编译时,就会出现这样的报错:
经过查询后才发现,原来 rand 是一个库函数我们并不能使自己的变量名与之相同。
这可麻烦了,到了工作时,我们面对海量的代码,势必会有各种各样相同的变量名字或函数名造成命名冲突,我们总不能一个一个改过去吧,那么有什么办法可以解决这一问题呢?
答案是肯定的,这就是接下来要讲到的命名空间(namespace)。
2.命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员(类似于结构体的样子);
//该命名空间的名字为hxy(花想云) namespace hxy { //定义自己的变量、函数等 int rand = 10; void qsort(int* a, int n) { //... } struct Node { int val; struct Node* next; //... }; }
命名空间可以嵌套;
namespace hxy { int rand = 10; namespace hxy2 { int rand = 20; namespace hxy3 { //.... } } }
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
//test.cpp中定义 namespace hxy { int rand = 10; void qsort(int* a, int n) { //... } struct Node { int val; struct Node* next; //... }; } //test.h中定义 namespace hxy { int sum = 0; int add(int a, int b) { //... } } //两个hxy会被合并成为一个
3.命名空间的使用
命名空间的使用有 3 种方式:
加命名空间名称及作用域限定符(::);
namespace hxy { int rand = 10; void qsort(int* a, int n) { //... } struct Node { int val; struct Node* next; //... }; } int main() { printf("%d\n", hxy::rand); return 0; }
使用using将命名空间中某个成员引入;
using hxy::rand; int main() { printf("%d\n",rand); return 0; }
使用using namespace 命名空间名称引入;
using namespace hxy; int main() { printf("%d\n", rand); return 0; }
4.命名空间使用注意事项
我们可能经常见到这样的语句:
using namespace std;
它告诉编译器在当前代码块中使用标准命名空间(namespace)std中的标识符 。
标准命名空间std是C++标准库的命名空间,包含了很多常用的函数和对象,例如输入/输出操作(cout、cin)、字符串处理、数学运算等。
使用using namespace std可以使代码更简洁易读,但可能会导致命名冲突或歧义。
实际开发项目的过程中,我们一般使用
1.域作用限定符访问;
#include <iostream> int main() { //cin、cout为C++中常用的输入输出语句 //end暂且可理解为作用与'\n'相同 std::cout << "hello world" << std::endl; return 0; }
2.部分常用展开使用;
using std::cout; using std::endl; int main() { cout << "hello world" << endl; return 0; }
在日常的代码练习中,为了方便可使用
3.全局展开。
using namespace std; int main() { cout << "hello world" << endl; return 0; }