我有一些C库,我希望能够在c ++类中包装并创建多个完全独立的实例。我试过这样做,但问题是C代码中的变量只是在所有c ++类实例之间共享。
我已经尝试制作静态库并引用它但无济于事。有谁知道怎么做到这一点?
下面的代码示例:我有一个名为CCodeTest的C文件,它只是向内存中的某些变量添加了一些数字。我在MathFuncsLib.cpp中有一个类,它使用它。我希望能够创建MyMathFuncs类的多个实例,并使C代码中的变量独立
CCodeTest.h
#ifndef C_CODE_TEST_H
#define C_CODE_TEST_H
extern int aiExternIntArray[3];
#if defined(__cplusplus)
extern "C" {
#endif
#define CCODE_COUNT 3
void CCodeTest_AddToIntArray(int iIndex_);
int CCodeTest_GetInternInt(int iIndex_);
int CCodeTest_GetExternInt(int iIndex_);
#if defined(__cplusplus)
}
#endif
#endif //defined(C_CODE_TEST_H)
MathFuncsLib.cpp
#include "MathFuncsLib.h"
#include "CCodeTest.h"
using namespace std;
namespace MathFuncs
{
void MyMathFuncs::Add(int iNum_)
{
CCodeTest_AddToIntArray(iNum_);
}
void MyMathFuncs::Print(void)
{
for(int i = 0; i < CCODE_COUNT; i++)
{
printf("Intern Index %i: %i\n", i, CCodeTest_GetInternInt(i));
printf("Extern Index %i: %i\n", i, CCodeTest_GetExternInt(i));
}
}
}
非常感谢任何帮助!
答案 0 :(得分:1)
您有一个名为aiExternIntArray
的全局变量。那就是问题所在。 C ++类的每个实例都在该数组上运行。
您需要做的是创建一个包含int [3]的struct
,以便您可以创建此类型的单独实例。
typedef struct
{
int aiIntArray[3];
} CodeTestStruct;
void CCodeTest_AddToIntArray(CodeTestStruct* ct, int iIndex_);
int CCodeTest_GetInternInt(CodeTestStruct* ct, int iIndex_);
int CCodeTest_GetExternInt(CodeTestStruct* ct, int iIndex_);
在C ++中,您的类应该封装CodeTestStruct
。
class CodeTestClass
{
public:
void AddToIntArray(int iIndex_)
{
CCodeTest_AddToIntArray(&m_ct, iIndex_);
}
int GetInternInt(int iIndex_)
{
CCodeTest_GetInternInt(&m_ct, iIndex_);
}
int GetExternInt(int iIndex_)
{
CCodeTest_GetExternInt(&m_ct, iIndex_);
}
private:
CodeTestStruct m_ct;
};
答案 1 :(得分:1)
感谢您的回答 - 上述建议都非常有效。 我的问题是一个不常见的问题,因为我试图运行的C代码将位于资源非常有限的嵌入式系统上,所以我试图最小化指针解除引用和状态管理等...
我在计算机exe中使用此C代码来模拟并行运行此代码的多个微处理器。所以我决定创建两个共享相同C源但接口略有不同的DLL,以便C代码在通过导入DLL加载时将位于单独的内存空间中,并允许我在一次执行中模拟多个微处理器流。
答案 2 :(得分:0)
这就是你永远不应该使用全局变量的原因。这包括像“单身人士”这样的全球变量的委婉说法。此规则有例外,但它们几乎都涉及系统级编程,不适用于应用程序或(非系统级)库。
要解决此问题,请修复C代码,使其对传递给它的参数进行操作,而不是全局变量。
答案 3 :(得分:0)