命名空间可以规避命名冲突
#include <iostream> namespace MJ { int age; void func(int age) { std::cout << "MJ::func() : " << age << std::endl; } } namespace JC { int age; void func(int age) { std::cout << "JC::func() : " << age << std::endl; } } int age; void func(int age) { std::cout << "::func() : " << age << std::endl; } int main(void) { MJ::age = 10; //使用名称空间MJ里的age JC::age = 20; //使用名称空间JC里的age ::age = 30; //使用默认全局名称空间里的age MJ::func(MJ::age); //使用名称空间MJ里的func JC::func(JC::age); //使用名称空间JC里的func ::func(::age); //使用默认全局名称空间里的func return 0; }
值得注意的是,有一个默认的全局命名空间,没有名字,只需要加上前缀::就行了。
命名空间的嵌套
#include <iostream> namespace MJ { namespace JC { int age; void func(int age) { std::cout << "JC::func() : " << age << std::endl; } } // namespace JC int age; void func(int age) { std::cout << "MJ::func() : " << age << std::endl; } } int age; void func(int age) { std::cout << "::func() : " << age << std::endl; } int main(void) { ::MJ::age = 10; //使用名称空间MJ里的age MJ::JC::age = 20; //使用名称空间JC里的age ::age = 30; //使用默认全局名称空间里的age ::MJ::func(MJ::age); //使用名称空间MJ里的func MJ::JC::func(MJ::JC::age); //使用名称空间JC里的func ::func(::age); //使用默认全局名称空间里的func return 0; }
命名空间是可以相互嵌套的,值得注意的是,所有名称空间默认嵌套在全局的默认命名空间::中。只不过一般情况下::可以省略不写。
名称空间导致的二义性
#include <iostream> namespace MJ { int age; void func(int age) { std::cout << "MJ::func() : " << age << std::endl; } } int age; void func(int age) { std::cout << "::func() : " << age << std::endl; } int main(void) { using namespace MJ; age = 10; //错误,不知道使用的哪个age return 0; }
这个时候,要写出名称空间才可以。