一、c++中呼叫c函式
c++和c是兩種完全不同的編譯鏈結處理方式,如果直接在c++裡面呼叫c函式,會找不到函式體,報鏈結錯誤。要解決這個問題,就要在 c++檔案裡面顯示宣告一下哪些函式是c寫的,要用c的方式來處理。
首先引用標頭檔案前需要加上 extern 「c」,
如果引用多個,那麼就如下所示:
[cpp]
view plain
copy
extern
「c」
;
然後在呼叫這些函式之前,需要將函式也全部宣告一遍:
[cpp]
view plain
copy
extern
「c」
;
c++程式中呼叫被c編譯器編譯後的函式,為什麼要加extern "c"?
c++語言支援函式過載,c語言不支援函式過載。函式被c++編譯後在庫中的名字與c語言的不同。假設某個c 函式的宣告如下:
[cpp]
view plain
copy
void
foo(
intx,
inty);
該函式被c 編譯器編譯後在庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字用來支援函式過載和型別安全連線。由於編譯後的名字不同,c++程式不能直接呼叫c 函式。c++提供了乙個c 連線交換指定符號extern「c」來解決這個問題。例如:
[cpp]
view plain
copy
extern
「c」
或者寫成
extern
「c」
這就告訴c++編譯譯器,函式 foo 是個c 連線,應該到庫中找名字_foo 而不是找_foo_int_int。c++編譯器開發商已經對c 標準庫的標頭檔案作了extern「c」處理,所以我們可以用#include 直接引用這些標頭檔案。
二、c中呼叫c++函式
呼叫c++函式庫,一般不能直接呼叫,需要將c++庫轉換成c介面輸出,方可以使用c呼叫; 將
c++函式宣告為
``extern "c"''
(在你的
c++**裡做這個宣告),然後呼叫它(在你的c或者
c++
**裡呼叫)。例如:
[cpp]
view plain
copy
// c++ code:
extern
"c"void
f(int
);
void
f(int
i)
然後,你可以這樣使用
f():
[cpp]
view plain
copy
/* c code: */
void
f(int
);
void
cc(int
i)
當然,這招只適用於非成員函式。如果你想要在
c裡呼叫成員函式(包括虛函式),則需要提供乙個簡單的包裝(
)。例如:
[html]
view plain
copy
// c++ code:
class c
;
然後你可以這樣呼叫c::f():
[cpp]
view plain
copy
/* c code: */
double
call_c_f(
struct
c* p,
inti);
void
ccc(
struct
c* p,
inti)
如果你想在c裡呼叫過載函式,則需提供不同名字的包裝,這樣才能被c**呼叫,例如:
[cpp]
view plain
copy
// c++ code:
void
f(int
);
void
f(double
);
extern
"c"void
f_i(
inti)
extern
"c"void
f_d(
double
d)
然後,你可以這樣使用每個過載的 f():
[cpp]
view plain
copy
/* c code: */
void
f_i(
int);
void
f_d(
double
);
void
cccc(
inti,
double
d)
注意,這些技巧也適用於在 c裡呼叫 c++ 類庫,即你不能修改c++標頭檔案。
C 與 C 互相呼叫函式,變數
1.c 呼叫c c 標頭檔案,example.h extern c void print int i extern c int g num c標頭檔案,example c.h void print c int i extern int g num c c 檔案,example.cpp include...
python與C 的互相呼叫
python與c 的互相呼叫 一 c 呼叫python 新建乙個專案,新增引用 ironpython.dll,microsoft.scripting.dll 在ironpython的安裝目錄中 建立乙個文字檔案命名為hello.py,把該檔案新增的當前的專案中,並設定為總是輸出。hello.py d...
python與c 的互相呼叫
這個很簡單 標頭檔案,引用的方式是 ifdef debug undef debug include define debug else include endif 因為不這樣的話會報python38 d.lib缺少的錯誤。網上沒有什麼好的辦法。1,修改配置檔案 2,自己重新編譯python,我這邊稍...