C 與C中的函式互相呼叫的處理

2021-06-27 17:49:27 字數 2548 閱讀 8127

一、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,我這邊稍...