混合编译:在c中使用c++中的类对象和类成员函数

24 篇文章 1 订阅
15 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值