經(jīng)常在C語言的頭文件中看到下面的代碼:
#ifdef__cplusplus extern"C"{ #endif //allofyourlegacyCcodehere #ifdef__cplusplus } #endif
這通常用于C++和C混合編程的時候,為了防止C++的編譯器在編譯C文件的時候出現(xiàn)錯誤;眾所周知,C++可以進行函數(shù)名重載,但是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查看函數(shù)符號;
g++-ctest.ctest.h objdump-ttest.o
可以看到函數(shù)符號已經(jīng)被編譯器修改了;

添加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查看函數(shù)符號;
g++-ctest.ctest.h objdump-ttest.o
這時候函數(shù)符號是正確的;

extern "C"是告訴C++的編譯器不要打我這些C函數(shù)的主意。
-
C語言
+關注
關注
183文章
7644瀏覽量
145571
原文標題:長見識:你真的知道C語言里extern "C" 的作用嗎?
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
C語言安全編碼指南:MISRA C、CERT C、CWE 與 C Secure 標準對比與Perforce QAC應用詳解
為什么c語言沒有輸出?
C語言特性
第4章 C語言基礎以及流水燈的實現(xiàn)(4.5 4.6)
第4章 C語言基礎以及流水燈的實現(xiàn)(4.3 4.4)
主流的 MCU 開發(fā)語言為什么是 C 而不是 C++?
深入理解C語言:C語言循環(huán)控制
如何在 樹莓派 上編寫和運行 C 語言程序?
C語言里extern "C" 是什么意思?
評論