极简式从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++#
查看6道真题和解析
CVTE公司福利 936人发布