【C++】浅谈C++的命名空间

284 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

【C++】浅谈C++的命名空间

namespace 命名空间

命名空间种类

unnamed-namespace

这样的命名的空间内的成员只对改文件可见,包含该文件的其他文件不可见。作用类似于C语言里的static,但是static只能修饰变量和函数,对于类无效。而c++用unnamed-namespace来取代。

     namespace  {
         int num = 10;
         class Foo {
         public:
             Foo() { std::cout<<"Create Foo.\n";}
             ~Foo() { std::cout<<"Destroyed Foo.\n";};
         };
 ​
         Foo foo;
     } // namespace 
 ​
     namespace co {
         void printLn(){ std::cout<<"print: "<<num<<"\n";}
     }
  • 作用域 未命名空间里的成员,与该命名空间所在的作用域相同,如果定义在最外层,即全局作用域。正如std::cout<<"print: "<<num<<"\n";中直接使用num一样,此时要和全局作用域中的变量名不能重合,否则会二义性。

  • 生命周期 用于静态生命周期 在第一次使用前创建,在整个程序结束时才销毁。

    验证如下:

     //main.cc
         #include"head.h"
         int main(int argc, char const *argv[]) {
             co::printLn();
             return 0;
         }
    

    输出

     $ g++ main.cc one.cc -o main
     $ ./main 
         Create Foo.
         printLn10();
         Destroyed Foo.
    

    由此可见,未命名空间的成员作用域是和在其第一次使用前开始,和程序一起结束。

全局命名空间

定义在所有的类、函数及命名空间之外定义的名字,也就是定义在全局命名空间。

比如全局命名空间中有成员num,显示的使用全局命名空间中的变量,方式是::num,如此就会在全局命名空间中查找该变量。

inline-namespace

即在命名空间前加上关键词inline,这是c++11的性质。使得上一级别的作用域可以直接使用该inline-namespace内的成员,而不用加前缀。

使用

using 声明

即具体的声明使用命名空间中的哪一个成员,比如:using std::string;

using 指示

开放全部:using namespace std;。不安全,不建议。