extern “C”

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   檔案   ar   div   

extern "C"一句話概括 extern "C" 的作用:告訴 C++ 編譯器,編譯某段代碼時不要進行名字重整,以此達到 C++ 中調用 C 函數,或者 C 中調用 C++ 函數的目的;之所以 C++ 會有名字重整,是因為 C++ 為了實現重載等特性,需要在編譯期把函數名重整,針對不同的參數調用識別不同的函數名;注意:extern "C" 是 C++ 為了相容 C 代碼才加上的東西,只在 C++ 裡才有, C 語言裡面是沒有 extern "C" 的;C模組: 不會有名字重整,編譯後,聲明的函數名都沒變: void foo(void) --> fooC++模組: 存在名字重整:編譯後,聲明的函數名會改變: void foo(void) --> xxxfooxxxC 模組中調用 C++ 函數: 兩個模組分別編譯,連結期 C 模組按照未重整的名字 foo 去 C++ 模組的 .obj 檔案裡尋找函數,會失敗!C++ 模組中調用 C 函數: 兩個模組分別編譯,連結期 C++ 模組按照重整後的名字 xxxfooxxx 去 C 模組的 .obj 檔案裡尋找函數,會失敗!C++ 為了相容 C 代碼,加上了 extern "C"。C++ 中調用 C 模組的函數:main.cpp:extern "C"{#include "CClass.h"};int _tmain(int argc, _TCHAR* argv[]){    foo();    return 0;}CClass.h 是C模組的標頭檔,以上代碼告訴編譯器, CClass.h 裡面的函式宣告,不要進行名字重整。這樣 main.cpp 在編譯的時候, CClass.h 裡面的函數不會進行名字重整,C++ 模組可以從中找到正確的函數;如果不加 extern "C" 就會出現連結錯誤:error LNK2001: 無法解析的外部符號 "void __cdecl foo(void)" (?[email protected]@YAXXZ)C++ 提供介面給 C 模組調用:cppclass.h:extern "C" void foo(void);extern "C" void func(int);main.cextern void foo(void);extern void func(int);cppclass.h 是 C++ 模組的標頭檔,以上代碼告訴編譯器,foo,func 這兩個函數,不要jinx那個名字重整。這樣 cppclass 在編譯的時候, foo,func 不會被重整, C 模組可以從中找到正確的函數。這種情況下,因為在 C 中 extern "C" 是不合法的,所以不能直接在 main.c 中 #include "cppclass.h", 而是通過 extern void foo(void); 的方式聲明 foo 這個函數,連結的時候會從 cppclass.obj 裡找到它。DLL 的標頭檔中使用 extern "C":在 DLL 中,如果我們用 C++ 編譯器編譯它而且沒有加上 extern "C",那麼就有可能這個 dll 不能被 C 模組調用,因為其中的函數被重整了。為了讓這個 dll 能夠被 C 模組調用,我們需要為它加上 extern "C",下面的標頭檔可以被 C 模組或 C++ 模組包含使用。// MyCFuncs.h#ifdef __cplusplusextern "C" {  // only need to export C interface if              // used by C++ source code#endif__declspec( dllimport ) void MyCFunc();__declspec( dllimport ) void AnotherCFunc();#ifdef __cplusplus}#endif

 

參考連結:

http://www.cnblogs.com/graphics/archive/2010/12/24/1916343.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.