像类一样隔离C库(C ++代码)

时间:2016-04-15 17:20:53

标签: c++ c

我使用库来控制设备。该库是用C语言编写的。该库有一个全局变量来保存设备ID(端口号)。该库提供了确定我们使用哪个端口的功能。

initialize(int deviceIndex, int baudrate)

此函数更改全局变量。所有其他函数都使用此全局变量。

我可以用这个库控制一个设备;但是,我想同时控制两台设备。

如果我使用此功能两次,全局变量发生了变化,我丢失了一台设备。

我用C ++编写代码。我想知道是否有任何方法可以使用这个库两次,就像我们创建多个对象的类一样,甚至每个类的公共变量都是独立的。

编辑:

  1. 有依赖于平台的方式。你在什么平台上?
  2. 我应该用Visual C ++(Windows)和Qt C ++(Linux Kubuntu)编写代码

    1. 您可以更改该库的源代码吗?
    2. 是的,我可以,但它是大约2000行和4个文件(两个.c和两个.h)

2 个答案:

答案 0 :(得分:4)

  

我想知道是否有任何方法可以使用此库两次。

在一个进程中,您只能拥有该库的一个实例及其符号(全局函数和变量)(无论它是静态库还是共享库)。如果您需要多个,则会生成更多进程。

您可以将此功能包装在一个类中,这样当您创建该类的对象时,它会自动为您生成一个工作者子流程,并且其成员函数使用某种形式的IPC与该特定子流程进行通信(例如管道,套接字对,共享内存,文件等。)。

答案 1 :(得分:1)

拥有设备ID的全局变量可能不是您在尝试将此库用于多个设备时必须面对的单个问题。库可以定义一堆其他全局或静态变量。

更糟糕的是,库与设备通信所执行的基础I / O可能无法同时与多个设备兼容。因此,您应该首先进行的第一个测试是在两个不同的可执行文件中运行库,并检查每个进程是否可以同时使用不同的设备。

如果这很有效,那么您可以选择Maxim建议的解决方案,或者尝试将您的库包装到一个或多个类中。对于后者,请确保在代码中找到所有全局变量和静态变量(这不应该太难)并使它们成为类的成员。