当前位置: 首页 > article >正文

c++11~c++20 内联命名空间

在工作,我们经常会引入第三方库,偶尔会碰到同名的函数和类型,造成编译冲突的问题。一般我们可以使用命名空间,例如

#include <iostream>
#include <iostream>
using namespace std;

namespace S1
{
	void foo()
	{
		cout << "S1::foo()\n";
	}
}

namespace S2
{
	void foo()
	{
		cout << "S2::foo()\n";
	}
}
using namespace S1;

int main()
{
	foo();
	S2::foo();
	system("pause");
	return 0;
}

结果:
在这里插入图片描述
在c++11中增强了命名空间的特性,提出了内联命名空间的概念 ,内联命名空间能够把空间内的函数和类型导出到父命名空间中,这样即使不指定子命名空间也可以使用其空间内的函数和类型了。
假设计算器类,提供了一个求和函数 long long Sum(int a,int b);突然某天加入了新特性,需要升级接口。有些客户需要升级,有些客户担心稳定性,而不愿意升级,还想用原来的接口,那我们就可以用下面的方法来解决该问题。
原来:

namespace Parent
{
	long long Sum(int a, int b)
	{
		printf("Parent:%d + %d = %d\n",a,b,a+b);
		return a + b;
	}
}

修改:
使用老接口(不愿意更新的用户)

namespace Parent
{
	inline namespace V0
	{
		long long Sum(int a, int b)
		{
			printf("Parent:%d + %d = %d\n", a, b, a + b);
			return a + b;
		}
	}

	namespace V1
	{
		long long Sum(int a, int b)
		{
			printf("V1:%d + %d = %d\n", a, b, a + b + 10);
			return a + b + 10;
		}
	}
}

using namespace Parent;

int main()
{
	int c = Sum(10, 20);
	printf("c = %d\n",c);
	system("pause");
	return 0;
}

结果:
在这里插入图片描述

使用新的接口(愿意更新的用户)

namespace Parent
{
	namespace V0
	{
		long long Sum(int a, int b)
		{
			printf("Parent:%d + %d = %d\n", a, b, a + b);
			return a + b;
		}
	}

	inline namespace V1
	{
		long long Sum(int a, int b)
		{
			printf("V1:%d + %d = %d\n", a, b, a + b + 10);
			return a + b + 10;
		}
	}
}

using namespace Parent;

int main()
{
	int c = Sum(10, 20);
	printf("c = %d\n",c);
	system("pause");
	return 0;
}

结果:
在这里插入图片描述
可以看到应用端无需该代码,底层库只需要改变inline的位置即可!


http://www.kler.cn/a/329126.html

相关文章:

  • 学习electron
  • mysql bin log分析
  • Vue 3 中 ref 属性详解:操作 DOM 元素的利器
  • 【C++】【算法基础】Nim游戏
  • docker--工作目录迁移
  • 如何在C#中处理必盈接口返回的股票数据?
  • Golang学习路线
  • 如何设计具体项目的数据库管理
  • Matlab 软件入门
  • Python 课程22-Pillow
  • Linux下的基本指令/命令(一)
  • PHP 语言基础教程学习笔记
  • 基于单片机汽车尾灯控制系统
  • 字符串形式返回小数
  • 新高考的五大变化‌‌(AI生成)
  • PHP反序列化6(session反序列化)
  • 确保架构与业务一致性和合规性的成功转型之路:理论与实践的全面解读
  • VR视频怎样进行加密和一机一码的使用?--加密(一)
  • Spring Boot 进阶- Spring Boot日志框架介绍
  • Python面向对象基础:属性动态添加
  • Java 编码系列:并发集合详解与面试题解析
  • C语言_字符函数和字符串函数
  • 网络原理-TCP协议
  • 使用 Docker 制作 YashanDB 镜像:深度解析与实战指南
  • 优秀博客:小程序通信方法在 Vue 3 中的对应技术
  • 分页查询前后端代码