1. 程式人生 > >C++呼叫C函式與Extern "C"

C++呼叫C函式與Extern "C"

Author: YuMaNzI

Date: 2015/04/13

---------------------------------------------------------------

在實際中,我們可能會遇到開發一個CPP的專案,而某一個模組的功能已經有現有的C實現的庫可以使用的情況。在CPP中通過Include標頭檔案+lib或其它的方式呼叫相應的C函式,編譯時會報LNK2001 unresolved external symbol錯誤,即找不到標頭檔案對應的函式體。出現這種錯誤的根本原因在於CPP在處理過載時對函式名做了特殊的處理。

C語言是不支援過載的,即所有函式不能重名。另一方面,C++是支援過載的,函式重名則進一步用變數區分不同的重名函式。因此對同一個簡單的函式宣告:

int add(int a, int b);
CPP會產生_add_int_int之類的名字,即用函式名+變數的形式支援函式的過載;而C則直接生成_add作為函式的名字。在預設的連結方式下,CPP按照自己的方式生成函式名,即認為此函式的名字是帶變數型別的。後續在lib檔案中按照這個名字找函式體時,由於找不到,最終返回LNK2001的錯誤。

為了解決這個問題,CPP提供了一個C引用的指定符號,例如在某CPP程式中要引用i_am_a_c_program.h中的函式,同時這些函式用C實現,可以通過

extern "C"
{
#include "i_am_a_c_program.c"
}
告訴CPP的編輯器,這些函式使用C實現的,在連結階段找它們的函式名時按照C的風格來。這樣問題就解決了。

希望這些能解決你看本文之前的問題。

-------------------------------------------------------------------------------------------

以上內容部分參考:http://blog.csdn.net/jirongzi_cs2011/article/details/14091163