C++ 语言特性02 - 命名空间

一:概述

现代C++中的命名空间是什么?

C++中的命名空间允许用户在命名空间范围内对类、方法、变量和函数等实体进行分组,而不是在全局范围内使用。这可以防止大型项目中的类、方法、函数和变量之间发生命名冲突。命名空间将开发人员编写的代码组织到不同逻辑范围中。因此,不同的用户可以在不同的进程中使用相同的方法和变量。

cpp 复制代码
#include <iostream>
 
namespace nsA
{
 void myf()
 {
 std::cout << "this is myf() function in nsA namespace\n";
 }
}
 
int main()
{ 
 nsA::myf(); // Let's use a method or function from nsA namespace
 
 system("pause");
 return 0;
}

在现代C++中,命名空间是一种库或框架。它们对于在不同的命名空间中保存相同命名的类、方法和其他实体非常有用。C++11标准和上面的其他标准,允许在命名空间定义中使用内联关键字,在这篇文章中,我们解释了如何在现代C++中使用内联命名空间。

C++11标准和上面的其他标准允许在命名空间定义中使用inline关键字。这样做是为了指定命名空间的成员可以被定义和专门化,就好像它们实际上属于封闭的命名空间一样。

在C++11和上述标准中,这种新构造称为内联命名空间,它解决了模板只能在其实际命名空间中进行专门化,而不能在其导入的命名空间中进行专门化的问题。

下面是内联命名空间的语法(从C++11开始)

cpp 复制代码
inline namespace name_of_ns
{ 
  // definition and declarations 
}

从C++17开始,你可以使用任意数量的属性的可选序列,如下所示。

cpp 复制代码
inline namespace <seq_attr> name_of_ns
{ 
   // definition and declarations 
} 

二:例子1

cpp 复制代码
namespace Lib
{
  inline namespace Lib_1
  {
    template <typename T> class A; 
  }

  template <typename T> void g(T);
}

struct MyClass {  };
namespace Lib
{
  template<> class A<MyClass> {  };
}

int main()
{
  Lib::A<MyClass> a;
  g(a);  // ok, Lib is an associated namespace of A
}
cpp 复制代码
namespace Parent {
    namespace V1 {
        void foo() { 
            std::cout << "foo v1.0" << std::endl; }
        }

    inline namespace V2 {
            void foo() { std::cout << "foo v2.0" << std::endl; }
    }
}

int main()
{
    Parent::foo(); //V2::foo
    Parent::V1::foo(); //V1:foo
}
相关推荐
沐晓时光2 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
David猪大卫8 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger8 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
fengci.9 小时前
CTF2MISC中等部分
开发语言·前端·学习
xys_67811 小时前
JavaEE通关手册:初识Java
java·开发语言
努力努力再努力wz11 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化11 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu12 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu13 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
坤坤子吖13 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json