C代码与C++;数据结构 我知道这不是一个好的开发项目的方法,但是由于我工作的一些原因,我致力于在C项目中集成C++中的一些数据结构(LRU缓存和哈希映射)。 P.>我知道在C++中有一些方法调用C函数使用外“C”< /C>,但是从C?< /P>调用C++对象(方法…)怎么样? 我使用GCC。< /P> < P>在C++界面上写一个C包装器。将它编译为C++,但是确保在C代码>外部“C”< /代码>块中包含C接口。这个新的接口应该与C程序链接精细,并提供对C++代码的访问。< P>你需要创建C兼容的转发函数,这些函数作为第一个参数指向对象。然后,转发函数[通常]将第一个参数强制转换为正确的对象类型,并调用相应的成员函数 // Function declaration in header extern "C" void function(void *object, int param1, int param2); // Function definition in source file extern "C" function(void *object, int param1, int param2) { static_cast<Object*>(object)->member_function(param1, param2); } //头中的函数声明 外部“C”void函数(void*object,int-param1,int-param2); //源文件中的函数定义 外部“C”函数(void*object、int-param1、int-param2) { 静态_cast(object)->成员_函数(param1,param2); } > p>如果所有代码都用C++编译器编译,则不存在(或非常少)问题。 如果你用G+编译了C++,用G++编译,那么你需要在你的类上写一个头包装器来让C++代码通过一组函数来可视化。
例如: MyClass.hC代码与C++;数据结构 我知道这不是一个好的开发项目的方法,但是由于我工作的一些原因,我致力于在C项目中集成C++中的一些数据结构(LRU缓存和哈希映射)。 P.>我知道在C++中有一些方法调用C函数使用外“C”< /C>,但是从C?< /P>调用C++对象(方法…)怎么样? 我使用GCC。< /P> < P>在C++界面上写一个C包装器。将它编译为C++,但是确保在C代码>外部“C”< /代码>块中包含C接口。这个新的接口应该与C程序链接精细,并提供对C++代码的访问。< P>你需要创建C兼容的转发函数,这些函数作为第一个参数指向对象。然后,转发函数[通常]将第一个参数强制转换为正确的对象类型,并调用相应的成员函数 // Function declaration in header extern "C" void function(void *object, int param1, int param2); // Function definition in source file extern "C" function(void *object, int param1, int param2) { static_cast<Object*>(object)->member_function(param1, param2); } //头中的函数声明 外部“C”void函数(void*object,int-param1,int-param2); //源文件中的函数定义 外部“C”函数(void*object、int-param1、int-param2) { 静态_cast(object)->成员_函数(param1,param2); } > p>如果所有代码都用C++编译器编译,则不存在(或非常少)问题。 如果你用G+编译了C++,用G++编译,那么你需要在你的类上写一个头包装器来让C++代码通过一组函数来可视化。,c++,c,gcc,C++,C,Gcc,例如: MyClass.h #ifdef __cplusplus class MyClass { public: MyClass() {/*STUFF*/} ~MyClass() {/*STUFF*/} int doStuff(int x, float y) {/*STUFF*/} }; extern "C" { #endif /* C Interface to MyClass */ void* createMyClass();
#ifdef __cplusplus
class MyClass
{
public:
MyClass() {/*STUFF*/}
~MyClass() {/*STUFF*/}
int doStuff(int x, float y) {/*STUFF*/}
};
extern "C" {
#endif
/* C Interface to MyClass */
void* createMyClass();
void destroyMyClass(void* mc);
int doStuffMyClass(void* mc, int x, float y);
#ifdef __cplusplus
}
#endif
源文件
MyClass.cpp
#include "MyClass.h"
void* createMyClass() {return reinterpret_cast<void*>(new MyClass);}
void destroyMyClass(void* mc) {delete reinterpret_cast<MyClass*>(mc);}
int doStuffMyClass(void* mc, int x, float y)
{
return reinterpret_cast<MyClass*>(mc)->doStuff(x,y);
}
好吧,你不能。不是没有为C++函数提供C包装,而是将对象暴露为结构/不透明指针。(而且,使用C++中的指针是“邪恶的”)不要忘记在代码中>代码> >“IPLF”/Cult>在代码中>“外部”“C”/代码>,以便它们可以从C中使用,并捕获C++代码中可能出现的任何异常(C不喜欢异常……)。此外,与其对对象指针使用
void*
,还不如向前声明一个伪struct
,以使类型安全性最低。
#include "MyClass.h"
int main()
{
void* myClass = createMyClass();
int value = doStuffMyClass(myClass, 5, 6.0);
destroyMyClass(myClass);
}