2013-07-31 53 views
3

林對我的C#項目中的C++ DLL工作,DLL具有在其內部創建和銷燬由外部功能,如類:「新」運算符的extern「C」使用

class myClass 
{ 
    int N; 
    public: 
     //some elements and some functions 

     myClass(int n) 
     { 
      N=n; 
     } 
}; 

__declspec(dllexport) myClass * builderF(int n) 
{ 

     return new myClass(n); 

} 

__declspec(dllexport) void destroyerF(myClass * c) 
{ 

     delete c; 

} 

,這些都是在extern「C」{} body。

編譯器如何讓我使用C++功能是「C」空間?僅僅用於C代碼?這是測試和工作(我開始爲C#做一個opencl包裝)。我以前只使用純C代碼。

+0

可能有幫助:[在C++源代碼中,extern「C」有什麼作用?](http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect- extern-c) –

+0

因此,鏈接與編譯完全不同?所以它只是編譯成一個C++代碼。 –

+0

這不僅編譯,但真的有用嗎?我的意思是'destroyerF'功能? o.O – lapk

回答

9

extern "C"不會將編譯器更改爲C編譯器。它 只說任何函數(或函數指針)將使用 的C約定在他們的界面。所以你仍然可以在函數中做C++中的任何事情;它的唯一的東西 像名字改編,並要求其將 影響慣例。

+0

好的,現在這個更清潔。謝謝。在幾分鐘內接受。每個編譯器必須給出完全相同的行爲 –

+2

繼續James的回答,你不能在extern「C」塊中做的唯一事情就是超載函數;通過名稱修改來管理重載,正如詹姆斯所說的那樣,這個塊中不存在重載。 – mah

+0

+1:請注意,某些編譯器可以使用指令切換到C模式,但這不是如何。 –