我已经在Stack Overflow上阅读了几个星期的问题......这将是我的第一个问题.
所以最近我研究了C访问/操作C++类.我理解理想情况下,在正常情况下,不应该单独用C和C++编译组件,但目前这不是一个选项.
我查看了有关能够在C中移植/使用C++的3个教程.它们是:
DevX上的 "C++和C互操作性指南"
Sun网站上的 "在同一程序中混合使用C和C++代码"一文.
"[32]如何在Parashift上混合使用C和C++"
首先,我已经知道:
您必须使用extern"C"来避免C++函数名称重整.
您需要与C兼容的回调原型.
G ++必须将C++编译成.o文件,GCC将特定于C的代码编译成.o文件,然后将它们链接起来.
结果,我的项目由4个文件组成:
这是我输入的代码,然后是我的问题:
foo.h中
// Header File foo.h
#ifndef FOO_H
#define FOO_H
//Content set inside this #ifdef will be unseen by C compilers
#ifdef __cplusplus
class Foo
{
public:
void setBar(int);
void printBar();
private:
int bar;
};
#endif
//end of C++-only visible components.
#ifdef __cplusplus
extern "C" {
#endif
//Stuff made to be seen by C compilers only. fooWrap.c has definitions.
#if defined(__STDC__) && !defined(__cplusplus)
typedef struct Foo Foo;
//C-wrappers for C++ callback functions.
Foo * c_NewFoo();
void c_SetFooBar( Foo *, int);
void c_PrintFooBar( Foo *);
#endif
//These are the functions C++ AND C can both use...
Foo * newFoo(); //allocates the memory for Foo class, pass address back.
void setFooBar( Foo * , int ); //set internal contents of Foo object.
void printFooBar ( Foo * ); //print internal contents of Foo object.
#ifdef __cplusplus
}
#endif
#endif /*FOO_H*/
Run Code Online (Sandbox Code Playgroud)
TEST.C
#include "foo.h"
// test.c test file for wrappers that manipulate C++ objects.
main()
{
//looks very C++ like... this makes C-Programmers cringe doesn't it?
Foo * cfoo = c_NewFoo();
Foo * cppfoo = newFoo();
//using the C-specific wrappers.
c_SetFooBar(cfoo,31415);
c_PrintFooBar(cfoo);
//using the C/C++ callback functions to Foo objects.
setFooBar(cppfoo,9001);
printFooBar(cppfoo);
}
Run Code Online (Sandbox Code Playgroud)
所以我将定义分成4个文件,正如我之前提到的......它编译得很好.但这是我不太了解的.
为什么sun和parashift文章建议创建C-Wrappers,其唯一的代码是将它的参数传递给C/C++兼容函数,然后调用C++特定代码?
即
//in Stuff.cpp
void CallCppStuff () { /* c++ stuff */ }
//in wrapStuff.c
wrapCppStuff() { CallCppStuff() }
Run Code Online (Sandbox Code Playgroud)
正如你从我的test.c文件中看到的那样......我能够在没有问题的情况下调用任何一组调用(据我所知).c_包装器是不必要的开销,还是我完全错过了它们的全部内容?我的唯一猜测是与C/C++的指针寻址方案有关......但我不确定.
此外,我想还有更多的问题,除此之外...但这三个网站都是我能找到的特定问题.因此,如果我有任何其他明显的疏忽,我会很感激他们的提及.
提前感谢任何帮助/建议,CX
如果您有一系列非面向对象的函数或在命名空间中,则无需再次包装它们.您的c_系列函数是多余的.
任何外部C的C++函数都具有全局(即非命名空间/静态成员)链接,并且只采用C-compat数据类型(通常我们使用像你一样的不透明指针),然后它不需要被包装.那是包装功能.C++直接使用成员函数,不需要使用它们,并且它们当然不需要被欺骗.