1. c 呼叫c++
// c++標頭檔案,example.hextern "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...