命名空间就是用来区分你使用的这个变量和函数是属于那一块的。用来防止不同的人所写函数和变量,名字相同产生冲突。
在写c++代码的时候,经常会使用标准库中的函数,使用之前我们必须在前面添加一个std::,因为c++标准库的函数是在命名空间std下定义的。
std::cout << "命名空间" << std::endl; // 比如输出数据,必须在前面加std::,否则编译器不认识
当然,有些人会使用using namespace来简化这个过程using namespace std; // 告诉编译器,下面没有写命名空间的都默认使用std下的
cout << "命名空间" << endl;
但是,不建议这样写,尤其是在全局或者头文件。
先来说原因: 如果你的程序中不止存在一个命名空间,而且这些命名空间中存在相同名字的函数或者变量,你去using会出现问题。
下面,我们自定义两个命名空间,然后对齐都进行using,内部包含一个同名函数,当我们去调用getAge()的时候会报错,因为,你同时using的两个命名空间中都有这个函数,编译器不知道用哪个,这就是不建议在全局的位置使用到using namespace;
当然,将using namespace放到头文件中那更是不行的,因为头文件会到处包含,包含其的文件中可能也存在using namespace,这时候很容易出现下面的问题。所以,一定不要将其放到头文件中。
namespace Student {int getAge() {}
}namespace Teacher {int getAge() {}
}using namespace Student;
using namespace Teacher;int main() {getAge(); // error
}
可以在比较小的一个范围内部使用using namespace,因为它只会作用在这个较小的作用域内部,是不会影响外界的。
代码中这样写,相应的using namespace 就不会去影响别的位置的使用,其只会在对应作用域内部有效。
namespace Student {int getAge() {}
}namespace Teacher {int getAge() {}
}void func() {using namespace Teacher;getAge();
}int main() {using namespace Student;getAge();
}
using 还可以只指定namespace的一个函数或者变量,而且命名空间可以取别的名字
namespace Student {using namespace std;int getAge() {}string getName() {} }namespace Teacher {int getAge() {} }void func() {using namespace Teacher;namespace t = Teacher; //给命名空间取别名t::getAge(); // 等价与Teacher::getAge() }int main() {using Student::getName;// getAge(); // errorStudent::getAge();getName(); }