一、 命名空间
-
嵌套命名空间
namespace B{ namespace C{ extern int x; // 声明变量 void g(int); // 声明函数原型 void g(long){ cout << "B::C::g(long)\n"; } }; }; using B::C::x; // 声明引用变量 x,把它引入到当前作用域 // 就不能在当前作用域定义同名变量了 using namespace B; // 引用命名空间,但不会把函数和变量引入到当前作用域 // 在当前作用域中仍然可以定义同名的变量和函数 using B::C::g; // 声明引用 void g(int) 和 void g(long) // 将函数名为 g 的所有函数都引入到当前作用域 namespace B::C{ int y = 1; int x = 2; // 定义变量 x void g(int a){ // 定义函数 void g(int) cout << "B::C::g(int)\n"; } void g(void){ cout << "B::C::g(void)\n"; } }; static int xx = 1; class A{ public: int xx; A(int xx){ A::xx = xx; } }; int main() { static int xx = 2; A a(3); cout << a.xx << endl; // 3 cout << ::xx << endl; // 1 cout << xx << endl; // 2 ::xx = 0; cout << ::xx << endl; // 0 cout << &::xx << endl; // 0x557c5799c010 cout << &xx << endl; // 0x557c5799c014 cout << B::C::x + B::C::y << endl; // 3 g(4); // B::C::g(int) g(4l); // B::C::g(long) cout << x << endl; // 2 // g(); // error: no matching function for call to ‘g()’ // using 之前没有该原型 return 0; }
-
匿名命名空间
类似静态声明,匿名命名空间中的变量和函数只能在当前模块中使用
MyTestNamespace cpp 文件:
namespace MyTestNamespace { // 匿名命名空间 namespace { int noName = 11; void noNameFunc() { std::cout << "no name namespace\n"; } } void globalFunc(); void MyTestClass::testFun() { globalFunc(); std::cout << noName << std::endl; noNameFunc(); } }