我經(jīng)常在C語言的頭文件中看到下面的代碼:
#ifdef __cplusplus extern “C” { #endif // all of your legacy C code here #ifdef __cplusplus } #endif
這通常用于C++和C混合編程的時候,為了防止C++的編譯器在編譯C文件的時候出現(xiàn)錯誤;
眾所周知,C++可以進(jìn)行函數(shù)名重載,但是C則沒有這種功能,那這和extern “C”又有什么關(guān)系呢?
先看下面這個表格,如下所示;
語言 | 描述 |
---|---|
C | 函數(shù)名可以作為唯一ID和代碼段的程序建立聯(lián)系 |
C++ | 因為重載的關(guān)系,函數(shù)名符號會被破壞,從而會根據(jù)函數(shù)的參數(shù)不同而重新生成函數(shù)符號 |
未添加 extern “C”
test.h
#ifndef TEST_H #define TEST_H void foo1(void); void foo2(void); void foo3(int i); #endif
test.c
void foo1(void){} void foo2(void) {} void foo3(int i){} int main(int argc,char** argv){ foo1(); foo2(); foo3(1); return 0; }
編譯這兩個文件,生成test.o文件,通過objdump查看函數(shù)符號;
g++ -c test.c test.h objdump -t test.o
可以看到函數(shù)符號已經(jīng)被編譯器修改了;
添加extern “C”
test.h
#ifndef TEST_H #define TEST_H #ifdef __cplusplus extern “C” { #endif void foo1(void); void foo2(void); void foo3(int i); #ifdef __cplusplus } #endif #endif
test.c
#ifdef __cplusplus extern “C” { #endif void foo1(void){} void foo2(void) {} void foo3(int i){} #ifdef __cplusplus } #endif int main(int argc,char** argv){ foo1(); foo2(); foo3(1); return 0; }
編譯這兩個文件,生成test.o文件,通過objdump查看函數(shù)符號;
g++ -c test.c test.h objdump -t test.o
這時候函數(shù)符號是正確的;
extern “C” 是告訴C++的編譯器不要打我這些C函數(shù)的主意。
好了,這次分享的比較簡單,也挺實用,我們下期再見。
END
作者:菜刀和小麥
來源:小麥大叔
版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。
編輯:jq
-
C++
+關(guān)注
關(guān)注
22文章
2113瀏覽量
73762 -
代碼
+關(guān)注
關(guān)注
30文章
4814瀏覽量
68849 -
編譯器
+關(guān)注
關(guān)注
1文章
1640瀏覽量
49215 -
c函數(shù)
+關(guān)注
關(guān)注
0文章
11瀏覽量
7532
原文標(biāo)題:你真的知道C語言里extern“C”的作用嗎?
文章出處:【微信號:pcbgood,微信公眾號:奈因PCB電路板設(shè)計】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論