2011-03-30 47 views
5

我一直想建立一個共享庫,其中將利用類,來保持它的運作乾淨(這可能需要很多投入或處理),但我仍然希望以C平臺爲目標。允許我的C++庫與C工作(精簡功能集)

如果我在我的所有原型上應用extern「C」{},並在示例中提供了一組模仿類函數的暴露函數,以便對象不是「必需」來使用我的庫,那麼這些常規函數是否可以正常工作在C程序中將鏈接到它?

+0

可能重複(http://stackoverflow.com/questions/4978330/c-library-with-c-interface) – CharlesB 2011-03-30 12:25:53

回答

6

如果你在你描述的fasion中創建了一個dll,也就是說,所有的接口都是extern「C」,並且接口中的所有類型都是POD的,那麼在C或.NET中你幾乎沒有問題使用它

例子:

class MyClass 
{ 
public: 
    MyClass(float x) {...} 
    void method(int x) {...} 
    ~MyClass() {...} 
}; 

#define MYAPI extern "C" __declspec(dllexport) //or whatever the syntax is for your compiler 

MYAPI MyClass* CreateMyClass(float x) 
{ 
    return new MyClass(x);  
} 

MYAPI void MyClass_method(MyClass* p, int x) 
{ 
    return p->method(x); 
} 

MYAPI void DestroyMyClass(MyClass* p) 
{ 
    delete p; 
} 
+4

不要忘了捕捉異常 - 異常不能跨越「爲extern‘C’,」邊界 – 2011-03-30 12:08:21

+0

@Larry流:謝謝。讓我們把它留給OP;) – 2011-03-30 12:33:12

+0

我很欣賞這個例子,從我讀過的關於這個表單的dll的例子來看,它也應該很簡單地移植到類Unix系統的共享對象。 – Alexander 2011-03-30 12:47:00

3

您可能需要有單獨的頭文件,對C源包括。 C頭文件不應該包含C編譯器可能需要解析的任何C++代碼。在那裏,你可以將C接口提供給你的C++庫。通過這個頭提供extern "C"修改,因爲你表明你會做,在函數聲明告訴編譯,使C程序聯動工作。

因此,如果您需要C程序來保存對象的引用,只需將它作爲void *指針在C接口中來回傳遞即可。在C中,你只是把它當作魔法餅乾。

其他職位通過一個DLL,它也很有學問,但不是嚴格意義上的(標準)語言方面暴露​​出的界面說話。

編輯

胡挫折感。 extern "C"部分是C++語法。因此,在C++方面,你必須用extern "C"聲明C接口的功能,但在C端,你不能有語法。您可以通過共同的成語出現這種情況:

#ifdef __cplusplus 
extern "C" { 
#endif 
void foo(); 
#ifdef __cplusplus 
} 
#endif 
[C++與C接口庫]的
+0

我很欣賞這個輸入,它看起來更像是一個有趣的挑戰,而不是一件難事。 – Alexander 2011-03-30 12:44:28

+1

@alexander:我很欣賞的反饋。祝你好運。 – gregg 2011-03-30 13:07:56