2014-10-26 90 views
2

這是合法的嗎?我想導出一個C函數,但在內部,該函數將使用C++類。Extern「C」函數內部使用C++類

extern "C" BOOL /*BOOL==int*/ Func() 
{ 
    return someclass::getinstance()->Func(); // this is just bool tho 
} 
+2

我不知道哪些文檔可以提供官方指導,但我始終都看到這一點。 – NPE 2014-10-26 15:03:16

回答

4

這是完全合法的。 extern「C」的目的是爲了防止Func()獲得其名稱(用類型信息裝飾),以便C模塊可以使用它的普通名稱鏈接到它。 C++調整名稱,以便可以解析具有相同名稱但不同參數列表的函數(函數重載)。

+0

+1確實,這是一種非常普遍的做法。雖然兩者都不是標準化的(AFAIK),但C名稱修改方案通常是[一致的](http://en.wikipedia.org/wiki/Name_mangling#C_name_decoration_in_Microsoft_Windows),而C++則遍佈全球。因此,從靜態庫和共享庫導出的函數通常被編寫爲'extern「C」'來使用C模式,並且在鏈接到編譯庫時允許編譯器之間(甚至在相同編譯器的不同版本之間)提供更好的互操作性。該wiki文章的其餘部分包含很好的解釋。 – 2014-10-26 15:45:24