經常在C語言的頭文件中看到下面的代碼:
#ifdef__cplusplus extern"C"{ #endif //allofyourlegacyCcodehere #ifdef__cplusplus } #endif
這通常用于C++和C混合編程的時候,為了防止C++的編譯器在編譯C文件的時候出現錯誤;眾所周知,C++可以進行函數名重載,但是C則沒有這種功能,那這和extern "C"又有什么關系呢?
先看下面這個表格,如下所示;
未添加 extern "C"
test.h
#ifndefTEST_H #defineTEST_H voidfoo1(void); voidfoo2(void); voidfoo3(inti); #endif
test.c
voidfoo1(void){} voidfoo2(void){} voidfoo3(inti){} intmain(intargc,char**argv){ foo1(); foo2(); foo3(1); return0; }
編譯這兩個文件,生成test.o文件,通過objdump查看函數符號;
g++-ctest.ctest.h objdump-ttest.o
可以看到函數符號已經被編譯器修改了;
添加extern "C"
test.h
#ifndefTEST_H #defineTEST_H #ifdef__cplusplus extern"C"{ #endif voidfoo1(void); voidfoo2(void); voidfoo3(inti); #ifdef__cplusplus } #endif #endif
test.c
#ifdef__cplusplus extern"C"{ #endif voidfoo1(void){} voidfoo2(void){} voidfoo3(inti){} #ifdef__cplusplus } #endif intmain(intargc,char**argv){ foo1(); foo2(); foo3(1); return0; }
編譯這兩個文件,生成test.o文件,通過objdump查看函數符號;
g++-ctest.ctest.h objdump-ttest.o
這時候函數符號是正確的;
extern "C"是告訴C++的編譯器不要打我這些C函數的主意。
-
C語言
+關注
關注
180文章
7605瀏覽量
136994
原文標題:長見識:你真的知道C語言里extern "C" 的作用嗎?
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論