C 與 C 互相呼叫函式,變數

2022-08-16 20:15:12 字數 1747 閱讀 4342

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 #include "example.h"

void print(int i)

int g_num_c = 0;

extern void print(int i);

extern int g_num;

void main()

結果:
c call c++

this is a  function defined in c++,variable defined in a c++ file:1

c call c

this is a  function defined in c,variable defined in a c file:0

c 呼叫c++的函式或變數,在c++的標頭檔案宣告為extern "c" ,c呼叫的時候只使用extern 宣告。

檢視目標檔案:

dump of file example_c.obj

file type: coff object

symbol為函式變數名前加_ .

dumpbin  /relocations example.obj>2.txt  可以看到c++中使用了extern "c"宣告,目標檔案中的symbol也是_g_num ,_print.

如果注釋掉example.cpp 中#include "example.h"

example_c.obj : error lnk2001: unresolved external symbol _print

example_c.obj : error lnk2001: unresolved external symbol _g_num

出現鏈結錯誤,dumpbin  /symbols example.obj>2.txt,c++的鏈結規則生成的symbol為 ?g_num@@3ha (int g_num),?print@@yaxh@z (void __cdecl print(int)).

可見,extern "c"告訴了c++的編譯器,使用c的鏈結規則生成和尋找目標檔案中的symbol名稱。

2.  c++ 呼叫c

//c++檔案,example.cpp

#include //#include "example.h"

void print(int i)

,宣告用於c++中,告訴編譯器對中宣告的函式或變數使用c的方式生成(或尋找)目標符號。

3. c++ 呼叫c中的內聯函式

c中的函式使用__inline宣告為內聯函式時,不會鏈結生成目標符號。

example_c.c中的函式改為 __inline void print_c(int i) ,在example_c.obj找不到print_c的符號。

可以使用__declspec( dllexport ) __inline void print_c(int i) 這樣的宣告,就會生成目標符號 external     | _print_c 。

參考:msdn,using extern to specify linkage ,

go與c互相呼叫

此例子來自於go原始碼中,藉此來和大家分享一下兩者如何呼叫,網上很多文章語言不詳,也沒有乙個完整的測試例子 首先src 目錄下有 testcgowin目錄下 這裡的 obj目錄是cgo生成的 這裡需要展示的是go中如何呼叫c語言匯出函式,以及在c語言中如何呼叫go的匯出函式.關鍵是cthread.g...

go與c互相呼叫

此例子來自於go原始碼中,藉此來和大家分享一下兩者如何呼叫,網上很多文章語言不詳,也沒有乙個完整的測試例子 首先src 目錄下有 testcgowin目錄下 這裡的 obj目錄是cgo生成的 這裡需要展示的是go中如何呼叫c語言匯出函式,以及在c語言中如何呼叫go的匯出函式.關鍵是cthread.g...

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

一 c 中呼叫c函式 c 和c是兩種完全不同的編譯鏈結處理方式,如果直接在c 裡面呼叫c函式,會找不到函式體,報鏈結錯誤。要解決這個問題,就要在 c 檔案裡面顯示宣告一下哪些函式是c寫的,要用c的方式來處理。首先引用標頭檔案前需要加上 extern c 如果引用多個,那麼就如下所示 cpp view...