你真的知道C語(yǔ)言里extern
▼點(diǎn)擊下方名片,關(guān)注公眾號(hào)▼
我經(jīng)常在C語(yǔ)言的頭文件中看到下面的代碼:
#ifdef?__cplusplus
extern?"C"?{
#endif
//?all?of?your?legacy?C?code?here
#ifdef?__cplusplus
}
#endif
這通常用于C
和C
混合編程的時(shí)候,為了防止C
的編譯器在編譯C
文件的時(shí)候出現(xiàn)錯(cuò)誤;眾所周知,
C
可以進(jìn)行函數(shù)名重載,但是C
則沒(méi)有這種功能,那這和extern "C"
又有什么關(guān)系呢?先看下面這個(gè)表格,如下所示;
語(yǔ)言 | 描述 |
---|---|
C | 函數(shù)名可以作為唯一ID和代碼段的程序建立聯(lián)系 |
C | 因?yàn)橹剌d的關(guān)系,函數(shù)名符號(hào)會(huì)被破壞,從而會(huì)根據(jù)函數(shù)的參數(shù)不同而重新生成函數(shù)符號(hào) |
未添加 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;
}
編譯這兩個(gè)文件,生成test.o
文件,通過(guò)objdump
查看函數(shù)符號(hào);g ?-c?test.c?test.h
objdump?-t?test.o
可以看到函數(shù)符號(hào)已經(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;
}
編譯這兩個(gè)文件,生成test.o
文件,通過(guò)objdump
查看函數(shù)符號(hào);g ?-c?test.c?test.h
objdump?-t?test.o
這時(shí)候函數(shù)符號(hào)是正確的;extern "C"
是告訴C
的編譯器不要打我這些C函數(shù)的主意。好了,這次分享的比較簡(jiǎn)單,也挺實(shí)用,我們下期再見(jiàn)。—— The End?——推薦好文??點(diǎn)擊藍(lán)色字體即可跳轉(zhuǎn)
賺錢(qián)了2021-07-09 老外的嵌入式編程規(guī)范(值得一看)2021-07-08 MQTT協(xié)議,終于有人講清楚了2021-07-05 如何通俗易懂地學(xué)習(xí)網(wǎng)絡(luò)協(xié)議?2021-07-06
原創(chuàng)不易,歡迎轉(zhuǎn)發(fā)、留言、點(diǎn)贊、分享給你的朋友,感謝您的支持!長(zhǎng)按識(shí)別二維碼關(guān)注我
你點(diǎn)的每個(gè)好看,我都認(rèn)真當(dāng)成了喜歡