极简式从C调用C++类方法

如果要从C内部从C ++调用类方法,可以使用类包装器。 此方法的一个优点是C ++类保持不变, 甚至可以存在于库中。

首先,让我们定义C ++类“ Circle”。为简单起见,我们将

在.h文件中进行所有操作,但对于在.h中声明并

在.cpp文件中定义的类,它也同样有效。

// Circle.h - a C++类
 
#ifndef CIRCLE_H
#define CIRCLE_H
 
class Circle {
    public:
        Circle(float radius):_radius(radius) {}
        float getArea() { return 3.14159 * _radius * _radius; }
    private:
        float _radius;
};
 
#endif

现在让我们为该类声明一个C ++包装器,该包装器声明

可以在C内部使用的extern C方法。此代码必须在C ++和C文件中都可以编译。

使用void *指向类实例。注意使用#ifdef __cplusplus。

/* Circle_C.h - 必须同时在C和C ++中进行编译*/
 
#ifndef Circle_C_H
#define Circle_C_H
 
    #ifdef __cplusplus
    extern "C" {
    #endif
 
    extern void *Circle_C_new(float radius);
    extern void  Circle_C_delete(void *circle);
    extern float Circle_C_getArea(void *circle);
 
    #ifdef __cplusplus
    }
    #endif
 
#endif

现在定义外部函数。它们只会编译为C ++,因此

可以引用类。

// Circle_C.cpp - 外部C函数定义
 
#include "Circle_C.h"
#include "Circle.h"
 
extern void *Circle_C_new(float radius) {
    return new Circle(radius);
}
 
extern void Circle_C_delete(void *circle) {
    Circle *c = (Circle *)circle;
    delete c;
}
 
extern float Circle_C_getArea(void *circle) {
    Circle *c = (Circle *)circle;
    return c->getArea();
}

现在,我们可以使用这些extern C函数来从C访问C ++类。这

是C主函数示例:

 /* mixed.c - 访问C ++方法的C文件*/
 
#include <stdio.h>
#include "Circle_C.h"
 
void main() {
    float radius = 1.5;
 
    // 获取指向Circle对象的指针
    void *circle = Circle_C_new(radius);
 
    // 将Circle对象传递给wrapper方法
    float area = Circle_C_getArea(circle);
 
    printf ("Circle of radius %f has area %f\n", radius, area);
 
    // 释放Circle对象的内存
    Circle_C_delete(circle);
}
这是一个示例制作文件,用于创建“混合”可执行文件。
# Makefile-创建可执行文件“ mixed”。必须链接stdc ++库
 
mixed: main.o Circle.o
    gcc -lstdc++ -o mixed main.o Circle_C.o
 
#将main编译为C
main.o: main.c
    gcc -c main.c -o main.o
 
# 将Circle_C编译为C ++
Circle_C.o: Circle_C.cpp
    g++ -c Circle_C.cpp -o Circle_C.o





#C/C++#
全部评论

相关推荐

点赞 3 评论
分享
牛客网
牛客企业服务