成员_函数(param1,param2); } > p>如果所有代码都用C++编译器编译,则不存在(或非常少)问题。 如果你用G+编译了C++,用G++编译,那么你需要在你的类上写一个头包装器来让C++代码通过一组函数来可视化。,c++,c,gcc,C++,C,Gcc" /> 成员_函数(param1,param2); } > p>如果所有代码都用C++编译器编译,则不存在(或非常少)问题。 如果你用G+编译了C++,用G++编译,那么你需要在你的类上写一个头包装器来让C++代码通过一组函数来可视化。,c++,c,gcc,C++,C,Gcc" />

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++代码通过一组函数来可视化。

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++代码通过一组函数来可视化。,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();

例如:

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();
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);
}