C中没有类和对象的概念,所以不识别C++的类对象和成员函数, 而如果要在c中使用c++的对象和成员函数应该怎么办呢?
我们可以自己写一个c++普通函数封装,然后在c文件中用void*来调用该c++类对象,用封装函数来调用该普通函数,具体如下:
PackBuilderApi.h//c和c++文件共用
#ifndef _PACK_BUILDER_API_H
#define _PACK_BUILDER_API_H
#include "CmdpackType.h"
#include "plw_inc.h"
#include "pclxl_inc.h"
#ifdef __cplusplus
extern "C" {
#endif
void createPack(void* _this, int pdltype, int cmdid, int nOfParam, int nOfData);
void addData(void* _this, unsigned long size, char* data);
void addParam(void* _this, int num, void* data, int type, char* paramName);
#ifdef __cplusplus
}
#endif
#endif
PackBuilderApi.cpp//c++封装函数具体实现
#include "PackBuilderApi.h"
#include "PackBuilder.h"
#include "fi_inc.h"
void createPack(void* _this, int pdltype, int cmdid, int nOfParam, int nOfData)
{
static_cast<PackBuilder*>(_this)->createPack(pdltype, cmdid, nOfParam, nOfData);
}
void addData(void* _this, unsigned long size, char* data)
{
static_cast<PackBuilder*>(_this)->addData(size, data);
}
void addParam(void* _this, int num, void* data, int type, char* paramName)
{
PackBuilder* builder = static_cast<PackBuilder*>(_this);
switch (type)
{
case eByte:
builder->addParam(num, (char*)data, paramName);
break;
case eShort:
builder->addParam(num, (short*)data, paramName);
break;
case eLong:
builder->addParam(num, (long*)data, paramName);
break;
case eInt:
builder->addParam(num, (int*)data, paramName);
break;
case eUByte:
builder->addParam(num, (unsigned char*)data, paramName);
break;
case eUShort:
builder->addParam(num, (unsigned short*)data, paramName);
break;
case eULong:
builder->addParam(num, (unsigned long*)data, paramName);
break;
case eUInt:
builder->addParam(num, (unsigned int*)data, paramName);
break;
case ePositionShort:
builder->addParam(num, (PositionShort*)data, paramName);
break;
case ePositionUShort:
builder->addParam(num, (PositionUShort*)data, paramName);
break;
case eFloat:
builder->addParam(num, (float*)data, paramName);
break;
case ePositionFloat:
builder->addParam(num, (PositionFloat*)data, paramName);
break;
case ePositionUByte:
builder->addParam(num, (PositionUByte*)data, paramName);
break;
case ePositionLong:
builder->addParam(num, (PositionLong*)data, paramName);
break;
case ePositionULong:
builder->addParam(num, (PositionULong*)data, paramName);
break;
case eMatrixShort:
builder->addParam(num, (MatrixShort*)data, paramName);
break;
case eMatrixFloat:
builder->addParam(num, (MatrixFloat*)data, paramName);
break;
case eSizeUShort:
builder->addParam(num, (SizeUShort*)data, paramName);
break;
case eBoxUByte:
builder->addParam(num, (BoxUByte*)data, paramName);
break;
case eBoxUShort:
builder->addParam(num, (BoxUShort*)data, paramName);
break;
case eBoxULong:
builder->addParam(num, (BoxULong*)data, paramName);
break;
case eBoxShort:
builder->addParam(num, (BoxShort*)data, paramName);
break;
case eBoxLong:
builder->addParam(num, (BoxLong*)data, paramName);
break;
case eBoxReal:
builder->addParam(num, (BoxReal*)data, paramName);
break;
default:
break;
}
}
int getnum(void* _this)
{
return static_cast<Stream*>(_this)->getnum();
}
.c文件//使用上面的c++封装函数
ADDRESS packBuilder = ((FIRMIFWORK*)g_PLWwork.port)->vpobj->packbuilder;
createPack(packBuilder, ePDL_PLW, eCL_PLW_ATTR_SetMaskTypePattern, 1, 1);
addParam(packBuilder, 1, &pos, ePositionFloat, NULL);
addData(packBuilder, bytesize, (char*)data);
printf("_ungetcNum = %d\n", getnum(pWork->vpobj->streamObject));
参考:
https://zhidao.baidu.com/question/531286375.html?skiptype=2