2011-09-27 25 views

回答

1

我會用C++實現庫。如果你需要C訪問,那麼這很容易手工完成,通過提供包含函數來獲得額外的「this」參數。

然而,在你開始之前,請閱讀SWIG文件,特別是它的限制和要避免的事情。如果你在設計你的C++接口時考慮到SWIG,你可以毫不費力地爲你生成許多語言的綁定。

編輯:這裏是一個C包裝爲C++類的一個簡單的例子。比方說,這是C++的類來包裝,讓我們把它test.h

class Test { 
public: 
    Test(); 
    int do_something(char* arg); 
private: 
    is_valid(); // see below for why you need this method 
}; 

這是你的C頭test_c.h

typedef void* TestHandle; 
TestHandle newTest(); 
int deleteTest(TestHandle h); 
int Test_do_something(TestHandle h, char* arg); 

而且你的C實施將是一個C++文件使用C函數,讓我們說test_c.cpp

extern "C" TestHandle newTest() 
{ 
    return (void*)new Test(); 
} 

extern "C" int deleteTest(TestHandle h) 
{ 
    Test* this = static_cast<Test*>(h); 
    if (!this->is_valid()) 
     return -1; // here we define -1 as "invalid handle" error 
    delete this; 
    return 0; // here we define 0 as the "ok" error code 
} 

extern "C" int Test_do_something(TestHandle h, char* arg) 
{ 
    Test* this = static_cast<Test*>(h); 
    if (!this->is_valid()) 
     return -1; // here we define -1 as "invalid handle" error 
    return this->do_something(arg); 
} 

is_valid()方法是有保證你不會傳遞一個壞的手柄。例如,您可以在所有實例中存儲magic number,然後is_valid()只是確保幻數在那裏。

+0

我喜歡這個主意,但是你能展示一個C++ C包裝器的例子嗎? – zeitue

+0

我用C包裝器例子更新了我的答案。 – Miguel

+0

謝謝你,這將工作完美我在這裏是新的,當我得到積分我會投你,但我不能直到人們不再投票給我失望ps:在最後一個問題,你認爲有可能有C包裝與C++類相同的二進制文件,函數? – zeitue

1

退房GObject - 這是一個開源的C庫,增加了對C面向對象的編程功能,並可以透明的a variety of languages創建綁定。

和它的夥伴Vala是一種面向對象的語言,可以編譯成C + GObject代碼,以幫助減少C + GObject的冗長度。