极简式从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++#