我有一个标头声明函数,这些函数将指向C ++对象的指针作为参数。该实现是一个单独的C ++文件。如何在C中包含此标头并使用C中的函数,即使参数需要是C ++对象指针?
答案 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 ++异常
关联程序