我想知道extern「C」是否是必須的?輸出符號時是否必須指定extern「C」?
回答
僅當您想從C(或不同的C++編譯器,您應該像C那樣對待)調用您的代碼時。
這是禁用name-mangling。
請參閱本文的C++ FAQ:http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
不,你用extern "C"
提供了C連接到你的C++函數,所以他們不會被「裝飾」像普通的C++功能,並允許他們從C(或Objective-C)調用。
函數修飾用於實現C++ function overloading功能,併爲函數的每個變體提供不同的簽名,同時允許開發人員使用他分配的名稱。
您的C++函數將通過簡單地不使用static
關鍵字自動導出。但是,如果您在Windows DLL中實現了C++函數,則必須使用declspec dllexport/dllimport
關鍵字在外部訪問它們。
在C用法上下文中,這可能是最受歡迎的名稱修改形式。除了重載之外,它還用於很多其他的事情。見http://en.wikipedia.org/wiki/Name_mangling – 2011-03-27 09:20:50
你能告訴我它還有什麼用途嗎? – trojanfoe 2011-03-27 09:28:15
無論是否存在重載,名稱可能會被損壞。命名空間是另一種情況。欲瞭解更多信息,請參閱我鏈接的文章。同樣,在C鏈接的情況下,有些情況可能不那麼重要,但它仍然用於超載。你的措辭意味着這是它存在的唯一原因。除此之外,我喜歡你的答案。 – 2011-03-27 09:31:32
使用extern "C"
關閉名稱修飾。如果你不這樣做,你可能會讓你的DLL的客戶端很難導入你的符號。
請記住,不同的C++編譯器具有不同的名稱修改規則,因此您的錯位導出名稱可能與導入時使用的名稱不同。
但是,如果您使用與用於DLL的編譯器不同的編譯器,那麼從DLL導入類是錯誤的,這是相當不實際的一點。
所以,如果你是出口類(通常是一個壞主意),更容易留下。否則請用extern "C"
將其關閉。
+1出口類是一個壞主意(除非你使用相同的編譯器)。 – 2011-03-27 09:42:42
- 1. 我是否必須一直指定System.Web.HttpContext.Current.Server?
- 2. 鍵必須是字符串或符號
- 3. 使用java,輸入字符串=「aabbcdeaaaabbb」,輸出必須是aaaa
- 4. 類中的C++方法定義是否必須指定返回類型?
- 5. 是否可以指定函數參數必須是字符串文字?
- 6. 無法指定必須是實例。 Django
- 7. 無法指定 - 必須是實例
- 8. 是否必須在C++中初始化指針?
- 9. java輸出在輸出時必須有6個數字時間
- 10. 我是否必須在Objective C中使用點符號來訪問結構值?
- 11. tf.boolean_mask,mask_dimension必須指定?
- 12. 是否必須在每個會話中指定tablockx?
- 13. 是否必須在web.xml文件中指定servlet過濾器?
- 14. 我是否必須在子類型中指定類型差異?
- 15. 退出應用程序時,是否必須釋放指針或自動完成?
- 16. 分配時是否必須使用initWithString?
- 17. 何時必須刷新C++中的輸出流?
- 18. 在Postgres上運行自定義插件時出錯,「輸出插件必須聲明_PG_output_plugin_init符號」
- 19. 是否必須跟隨ELSE
- 20. WriteStream是否必須關閉?
- 21. 是否必須使用SSL?
- 22. UIPageViewController是否必須全屏?
- 23. 方法定義是否可以指定參數必須是常量?
- 24. ANSI C在創建結構時是否必須使用malloc()?
- 25. 當使用 - >和「必須是類類型」時,給出「必須是類指針類型」的對象使用
- 26. C#是否有預定義的符號?
- 27. 當我在glade中指定函數名稱時,是否必須手動附加gtk信號處理程序?
- 28. Visual C++ |限定符必須是基類「富」的
- 29. 什麼時候我們必須在C#中使用extern別名關鍵字?
- 30. 多線程時,我是否必須鎖定數據庫連接?
我使用顯式鏈接,沒有這個,我發現GetProcAddress失敗。 – user496949 2011-03-27 09:17:40
@ user496949:您也必須在C函數的導入上使用它。 Win32 API是用C語言編寫的,而不是C++,因此必須告訴C++不要使用名稱來理解它。 – 2011-03-27 09:18:51
這不僅需要從C調用代碼,而且還需要使用不同名稱修改的C++編譯器。 – 2011-03-27 09:53:12