2011-03-27 38 views

回答

8

僅當您想從C(或不同的C++編譯器,您應該像C那樣對待)調用您的代碼時。

這是禁用name-mangling

請參閱本文的C++ FAQ:http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

+0

我使用顯式鏈接,沒有這個,我發現GetProcAddress失敗。 – user496949 2011-03-27 09:17:40

+0

@ user496949:您也必須在C函數的導入上使用它。 Win32 API是用C語言編寫的,而不是C++,因此必須告訴C++不要使用名稱來理解它。 – 2011-03-27 09:18:51

+1

這不僅需要從C調用代碼,而且還需要使用不同名稱修改的C++編譯器。 – 2011-03-27 09:53:12

1

不,你用extern "C"提供了C連接到你的C++函數,所以他們不會被「裝飾」像普通的C++功能,並允許他們從C(或Objective-C)調用。

函數修飾用於實現C++ function overloading功能,併爲函數的每個變體提供不同的簽名,同時允許開發人員使用他分配的名稱。

您的C++函數將通過簡單地不使用static關鍵字自動導出。但是,如果您在Windows DLL中實現了C++函數,則必須使用declspec dllexport/dllimport關鍵字在外部訪問它們。

+0

在C用法上下文中,這可能是最受歡迎的名稱修改形式。除了重載之外,它還用於很多其他的事情。見http://en.wikipedia.org/wiki/Name_mangling – 2011-03-27 09:20:50

+0

你能告訴我它還有什麼用途嗎? – trojanfoe 2011-03-27 09:28:15

+0

無論是否存在重載,名稱可能會被損壞。命名空間是另一種情況。欲瞭解更多信息,請參閱我鏈接的文章。同樣,在C鏈接的情況下,有些情況可能不那麼重要,但它仍然用於超載。你的措辭意味着這是它存在的唯一原因。除此之外,我喜歡你的答案。 – 2011-03-27 09:31:32

1

使用extern "C"關閉名稱修飾。如果你不這樣做,你可能會讓你的DLL的客戶端很難導入你的符號。

請記住,不同的C++編譯器具有不同的名稱修改規則,因此您的錯位導出名稱可能與導入時使用的名稱不同。

但是,如果您使用與用於DLL的編譯器不同的編譯器,那麼從DLL導入類是錯誤的,這是相當不實際的一點。

所以,如果你是出口類(通常是一個壞主意),更容易留下。否則請用extern "C"將其關閉。

+0

+1出口類是一個壞主意(除非你使用相同的編譯器)。 – 2011-03-27 09:42:42

相關問題