我一直想建立一個共享庫,其中將利用類,來保持它的運作乾淨(這可能需要很多投入或處理),但我仍然希望以C平臺爲目標。允許我的C++庫與C工作(精簡功能集)
如果我在我的所有原型上應用extern「C」{},並在示例中提供了一組模仿類函數的暴露函數,以便對象不是「必需」來使用我的庫,那麼這些常規函數是否可以正常工作在C程序中將鏈接到它?
我一直想建立一個共享庫,其中將利用類,來保持它的運作乾淨(這可能需要很多投入或處理),但我仍然希望以C平臺爲目標。允許我的C++庫與C工作(精簡功能集)
如果我在我的所有原型上應用extern「C」{},並在示例中提供了一組模仿類函數的暴露函數,以便對象不是「必需」來使用我的庫,那麼這些常規函數是否可以正常工作在C程序中將鏈接到它?
如果你在你描述的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;
}
不要忘了捕捉異常 - 異常不能跨越「爲extern‘C’,」邊界 – 2011-03-30 12:08:21
@Larry流:謝謝。讓我們把它留給OP;) – 2011-03-30 12:33:12
我很欣賞這個例子,從我讀過的關於這個表單的dll的例子來看,它也應該很簡單地移植到類Unix系統的共享對象。 – Alexander 2011-03-30 12:47:00
您可能需要有單獨的頭文件,對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接口庫]的
可能重複(http://stackoverflow.com/questions/4978330/c-library-with-c-interface) – CharlesB 2011-03-30 12:25:53