如何从C调用C ++函数?

时间:2010-10-25 04:17:43

标签: c++ c

我有一个标头声明函数,这些函数将指向C ++对象的指针作为参数。该实现是一个单独的C ++文件。如何在C中包含此标头并使用C中的函数,即使参数需要是C ++对象指针?

7 个答案:

答案 0 :(得分:6)

不幸的是,我的第一次尝试回答了错误的问题......

对于你提出的问题......

有人指出,你可以绕过void *。这也是我也会推荐的。就C而言,指向C ++对象的指针应该是完全不透明的。

如果C ++函数位于全局命名空间中,则它们也可以标记为extern "C"。这是一个例子:

myfunc.hpp:

#ifdef __cplusplus
extern "C" {
#endif

extern int myfunction(int, void *ob);

#ifdef __cplusplus
}
#endif

myfunc.cpp:

#include "myfunc.hpp"

void myfunction(int x, void *vobptr)
{
    ClassType *ob = static_cast<ClassType *>(vobptr);
}

afoofile.c

#include "myfunc.hpp"

void frobble(int x, void *opaque_classtype_ptr) {
    myfunction(x, opaque_classtype_ptr);
    /* do stuff with buf */
}

另一个选择是在C中创造性地使用typedef s做同样的事情。这个,恕我直言,非常难看,但无论如何这是一个例子:

myfunc.hpp:

#ifdef __cplusplus
extern "C" {
#else
typedef void ClassType;  /* This is incredibly ugly. */
#endif

extern int myfunction(int, ClassType *ob);

#ifdef __cplusplus
}
#endif

myfunc.cpp:

#include "myfunc.hpp"

void myfunction(int x, ClassType *ob)
{
    // Do stuff with ob
}

afoofile.c

#include "myfunc.hpp"

void frobble(int x, ClassType *opaque_classtype_ptr) {
    myfunction(x, opaque_classtype_ptr);
    /* do stuff with buf */
}

答案 1 :(得分:3)

如果你的C代码只需要传递指针,并最终将它传递回一些实际上处理它所指向的对象的C ++,那么你应该可以在C中使用void *代码,并在返回到C ++时转回T *

如果您计划使用指针实际使用 C代码,那么您很可能会遇到编译器正在进行的逆向工程,并且尝试将其模拟得足够紧密以使其工作正常。即使充其量也是如此,这将是丑陋和脆弱的。

答案 2 :(得分:1)

创建一个C ++封装模块,但其外部函数声明为extern "C"。这将允许您从C中干净地访问C ++代码。自然地,包装器应该使用void指针(快速和脏的解决方案)或指向不完整的{{}指针替换任何指向C(即类)中无法表示的类型的指针。 1}}类型(只要它们被一致地使用,它们将提供某种程度的类型安全性。

答案 3 :(得分:1)

在阅读关于此主题的各种帖子之后离开这一点,这是最容易遵循的。

http://research.engineering.wustl.edu/~beardj/Mixed_C_C++.html

此外,在netbeans中,该示例开箱即用,无需触摸makefile。

答案 4 :(得分:0)

秘密是“extern C”,其主要目的是防止名字装饰。

答案 5 :(得分:0)

你做不到。您必须创建一个C兼容的抽象层:

typedef struct foowrapper *foohandle;

foohandle foo_create();
void foo_delete(foohandle);

int foo_getvalue(foohandle);
void foo_dosomething(foohandle, const char* str);

答案 6 :(得分:-1)

查看此链接: -

http://developers.sun.com/solaris/articles/mixing.html

该链接包含以下主题:

  • 使用兼容编译器

  • 从C ++源代码中访问C代码

     -  Accessing C++ Code From Within C Source
    
  • 混合使用IOstream和C标准I / O

  • 使用指针到函数

  • 使用C ++异常

  • 关联程序