问题描述:在一个大的项目中往往会包括很多模块,会有不同的部门或公司来负责实现某个模块,也有可能有第三方或客户的参与。假如他们都用到了某个开源软件,底层模块根据自身的需求对这个开源软件进行了修改或裁减。上层也用到了此开源软件,根据它自己的需求不需要做改动。如果在一个项目中,底层和上层分别同时引入两次此开源软件,就会发生接口冲突。并且底层想对上层隐藏对此开源软件的使用,此时可以通过对接口重命名来解决冲突。

下面举一个简单实例来说明:

1、   首先模拟一个简单的开源库integerArithmetic.lib,实现简单的整数加、减、乘、除运算:包含2个文件,funset.h和funset.cpp,作为上层直接调用;

funset.h:

#ifndef _FUNSET_H_
#define _FUNSET_H_int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int division(int a, int b);#endif //_FUNSET_H_

funset.cpp:

#include "funset.h"int add(int a, int b)
{return (a + b);
}int sub(int a, int b)
{return (a - b);
}int mul(int a, int b)
{return (a * b);
}int division(int a, int b)
{if (b == 0) return -1;return (a / b);
}

2、   对原integerArithmetic库进行改写,重新生成fbc.lib:包含5个文件,fbc.h, funset.h, rename.h, root.h和funset.cpp,fbc.h为上层提供的接口;

funset.h:

#ifndef _FUNSET_H_
#define _FUNSET_H_int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int division(int a, int b);#endif //_FUNSET_H_

funset.cpp:

#include "root.h"int add(int a, int b)
{return (a + b) / 2;
}int sub(int a, int b)
{return (a - b) / 2;
}int mul(int a, int b)
{return (a * b) / 2;
}int division(int a, int b)
{if (b == 0) return -1;return (a / b) / 2;
}

rename.h:

#ifndef _DONT_RENAME_
//To avoid any possible linking confliction, rename all exported names#define add RENAME_add
#define sub RENAME_sub
#define mul RENAME_mul
#define division RENAME_division#endif //!_DONT_RENAME_

root.h:

#ifndef _ROOT_H_
#define _ROOT_H_#include "rename.h"
#include "funset.h"#endif //_ROOT_H_

fbc.h:

#include "root.h"#define fbc_add add
#define fbc_sub sub
#define fbc_mul mul
#define fbc_division division

3、   新建一个testRename控制台工程,测试这两个库,包含6个文件:testfbc.h, testfbc.cpp, testintegerArithmetic.h,testintegerArithmetic.cpp, stdafx.cpp, testRename.cpp:

testfbc.h:

#ifndef _TEST_FBC_H_
#define _TEST_FBC_H_void cal_fbc(int a, int b);#endif //_TEST_FBC_H_

testfbc.cpp:

#include "stdafx.h"
#include "testfbc.h"
#include "../fbc/fbc.h"
#include <iostream>using namespace std;void cal_fbc(int a, int b)
{cout<<"test fbc lib:"<<endl;cout<<"add = "<<fbc_add(a, b)<<endl;cout<<"sub = "<<fbc_sub(a, b)<<endl;cout<<"mul = "<<fbc_mul(a, b)<<endl;cout<<"division = "<<fbc_division(a, b)<<endl;
}

testintegerArithmetic.h:

#ifndef _TEST_INTEGER_ARITHMETIC_H_
#define _TEST_INTEGER_ARITHMETIC_H_void cal_integerArithmetic(int a, int b);#endif//_TEST_INTEGER_ARITHMETIC_H_

testintegerArithmetic.cpp:

#include "stdafx.h"
#include "testintegerArithmetic.h"
#include "../integerArithmetic/funset.h"
#include <iostream>using namespace std;void cal_integerArithmetic(int a, int b)
{cout<<"test integerArithmetic lib:"<<endl;cout<<"add = "<<add(a, b)<<endl;cout<<"sub = "<<sub(a, b)<<endl;cout<<"mul = "<<mul(a, b)<<endl;cout<<"division = "<<division(a, b)<<endl;
}

stdafx.cpp:

#include "stdafx.h"// TODO: reference any additional headers you need in STDAFX.H
// and not in this file#pragma comment(lib, "../debug/fbc.lib")
#pragma comment(lib, "../debug/integerArithmetic.lib")

testRename.cpp:

#include "stdafx.h"
#include <iostream>
#include "testintegerArithmetic.h"
#include "testfbc.h"using namespace std;int main(int argc, char* argv[])
{int a, b;a = 10;b = 2;cal_integerArithmetic(a, b);cal_fbc(a, b);cout<<"ok"<<endl;return 0;
}

测试运行,结果正确,这两个库中包含了重名的add, sub, mul, division四个函数,在testRename中同时调用这两个库并没有产生冲突。

使用dumpbin工具查看fbclib.lib,Symbol Name分别为RENAME_add, RENAME_sub, RENAME_mul, RENAME_division;而integerArithmetic.lib中Symbol Name分别为add, sub, mul, division,所以不会产生冲突。

接口冲突的一种解决方法相关推荐

  1. 使用小乌龟TortoiseGit快速解决代码冲突的三种解决方法:

    使用小乌龟TortoiseGit快速解决代码冲突的三种解决方法: 1.Resolved:手动查看并解决完冲突以后使用. 2.Resolve conflict using "CHERRY_PI ...

  2. android中view手势滑动冲突的两种解决方法

    android中view手势滑动冲突的解决方法,主要解决方法有两种,外部和内部拦截.有需要的可以参考下. Android手势事件的冲突跟点击事件的分发过程息息相关,由三个重要的方法来共同完成,分别是: ...

  3. 创业冲突的五种解决方法是_当创始合伙人发生冲突时,最好的解决方法4和5

    原标题:当创始合伙人发生冲突时,最好的解决方法4和5 各位小麦粉的朋友,今天小编将会给各位分享当创始合伙人发生冲突时,最好的解决方法4和5,希望能给您带来帮助. 方法4:拥抱冲突,公平斗争 我们作为创 ...

  4. 创业冲突的五种解决方法是_避免创业合伙人之间发生冲突的四种方法

    由于创业合伙人之间认识上的差异.信息沟通上的障碍.态度的相悖以及利益的互斥,产生矛盾冲突在所难免.当矛盾冲突发生后,创业合伙人到底该如何做呢?这里有四种处理方法值得借鉴. 方法一:自我批评.创业合伙人 ...

  5. 创业冲突的五种解决方法是_不会说话,不懂处理人际冲突怎么办?《沟通的艺术》5步教会你...

    关注"夏娃蓝空间",陪你成长为更好的自己. 想要良好地解决冲突,一定要有"这是我们两个人共同的事"的态度. 今年夏天最热门的电视剧非<三十而已>莫属 ...

  6. 创业冲突的五种解决方法是_五个处理厨师矛盾的方法,希望可以对后厨管理有所帮助...

    厨师之间产生矛盾如何处置,是摆在行政总厨面前的一个棘手的问题,搞不好会影响全局工作,轻者发生口角,重者会动用拳脚,甚至有的会给双方造成伤害.在处理这种矛盾之前弄清矛盾产生的原因十分重要.一般厨师出现矛 ...

  7. 创业冲突的五种解决方法是_当合伙人发生冲突时,最好的解决办法是什么?

    原标题:当合伙人发生冲突时,最好的解决办法是什么? 本文来源于微信公众号:经纬创投 微信ID:matrixpartnerschina 创业是一段漫长的旅程.费尽力气,在茫茫人海中寻找合乎自己想象的合伙 ...

  8. 创业冲突的五种解决方法是_当创业合伙人发生冲突时,最好的解决办法看这5招...

    原标题:当创业合伙人发生冲突时,最好的解决办法看这5招 小编今天与各位创业的合伙人和高管分享一位朋友的经历,然后根据其经历得出来的一篇文章:创业是一段漫长的旅程.现实中创业者往往会费尽力气,在茫茫人海 ...

  9. 创业冲突的五种解决方法是_大学生创业团队的冲突管理

    management and different team leaders 一.文章简介 在<浅谈组织内部的冲突管理>一文中,作者分别从冲突的类型的定义 和类型, 冲突产生的原因和冲突的两 ...

最新文章

  1. 2022-2028年中国水处理分离膜行业市场现状调研及市场需求潜力报告
  2. mysql教程多表查询_mysql重点,表查询操作和多表查询
  3. php文件下载到服务器代码,PHP文件下载实例代码浅析
  4. 在手机网页中使用USEMAP
  5. cisco stp技术应用
  6. mysql某个字段改为非unique
  7. 433M射频遥控灯、震动感应灯、WIFI避障小车
  8. [转]使用npm发布vue组件
  9. jQuery操作radio、checkbox、select总结
  10. android怎么引用ttf字体,android 自定义字体ttf使用的几种方法
  11. hadoop 3.x 关闭安全模式
  12. 设计模式(五)学习----装饰模式
  13. 【c语言】调整数组使奇数所有都位于偶数前面
  14. Twaver-HTML5基础学习(33)自动布局
  15. 最全英语日期相关表达
  16. 【中国剩余定理】互素与不互素的情况详解
  17. h5 实现简单的png icon 换颜色效果
  18. 【Python高级编程】
  19. pycharm中 Make available to all projects的含义
  20. SpringBoot+Netty开发IM即时通讯系列(一)

热门文章

  1. 机器学习中的数学基础(4.1):支持向量机Support Vector Machine(SVM)
  2. 用Python发一个高逼格的朋友圈
  3. 优达学城《DeepLearning》2-2:迁移学习
  4. 机器学习(6)KNN算法(K-近邻算法)
  5. ubuntu系统怎么安装ssh服务器配置,如何在Ubuntu 20.04 LTS上安装SSH服务器
  6. matlab中调用java代码_Matlab中调用第三方Java代码
  7. opengl库区分:glut、freeglut、glfw、glew、gl3w、glad
  8. 【亲测可用】用Electron和electron-builder打包Vue项目为exe可执行文件安装包(不推荐,个人觉得没有VNISEdit和NW好用,而且有些配置文件还挺脑残!)
  9. 个人建议:设置Alt+S快捷键来控制VSCode自动保存切换功能
  10. Ubuntu 14.04 64bit上玩转graphviz绘图工具