我一直在Stack Overflow上閱讀幾個星期的問題......這將是我的第一個問題。關於C++類訪問/操作C
所以最近我研究過讓C訪問/操作一個C++類。我理解理想情況下,在正常情況下,不應該分別使用C和C++編譯組件,但目前這不是一種選擇。
我看着就能夠端口3個教程/ C中使用C++,它們是:
上DevX
「指南C++和C的互操作性」,「混合使用C和C++代碼中
:[32]如何在 Parashift首先,我已經知道混合C和C++ 「相同的程序」上Sun's site.
文章」 0
您必須使用extern「C」來避免 C++函數名稱損壞。
您需要兼容C的回調原型。
G ++必須將C++編譯爲.o文件,GCC將C特定代碼編譯爲.o文件,然後將兩者鏈接起來。
其結果是,該項目我是由4個文件:
- foo.h中,標頭會列出所有原型,C/C++會看到(類隱形下向C當然)
- foo.cpp包含Foo類,和一組C調用的回調函數來調用類和方法。
- fooWrap.c一組引用foo.cpp中的回調函數的特定於C的包裝器。
- main.c測試方法。
這裏我輸入了代碼,那麼我的問題:
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*/
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);
}
所以我分裂定義成4正如我前面提到的那樣...並且它編譯得很好。但這是我沒有得到的。
爲什麼sun和parashift文章建議創建C-Wrappers,它的唯一代碼是將參數傳遞到C/C++兼容函數,然後調用C++特定代碼?
即
//in Stuff.cpp
void CallCppStuff() { /* c++ stuff */ }
//in wrapStuff.c
wrapCppStuff() { CallCppStuff() }
正如你可以從我的test1.c文件看...我可以調用任何設置沒有問題的呼叫(只要我可以告訴)。c_ wrappers是不必要的開銷,還是我完全忽略了它們的全部意義?我唯一的猜測與C/C++的指針尋址方案有關......但我不確定。
此外,我想除此之外還有更多的問題......但這3個網站都是我能找到的具體問題。所以如果我還有其他明顯的疏忽,我會很感激他們提到的。
預先感謝任何幫助/建議, CX
謝謝。正如我想的那樣......但是當太陽和Parashift文章做出冗餘功能時,我又有點困惑。 – CodeXCDM 2010-07-06 14:03:09
另外,您忘記了DeleteFoo功能。 – Puppy 2010-07-06 15:56:09