日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 小麥大叔
[導讀]▼點擊下方名片,關注公眾號▼大家好,我是小麥,今天是周末,但是也不能停下學習的腳步。我經(jīng)常在C語言的頭文件中看到下面的代碼:#ifdef?__cplusplusextern?"C"?{#endif//?all?of?your?legacy?C?code?here#ifdef?__...


點擊下方名片,關注公眾號

大家好,我是小麥,今天是周末,但是也不能停下學習的腳步。

我經(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 可以進行函數(shù)名重載,但是C則沒有這種功能,那這和extern "C"又有什么關系呢?
先看下面這個表格,如下所示;

語言描述
C函數(shù)名可以作為唯一ID代碼段的程序建立聯(lián)系
C 因為重載的關系,函數(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ù)的主意。

好了,這次分享的比較簡單,也挺實用,我們下期再見。

—— The End?—
推薦好文??點擊藍色字體即可跳轉(zhuǎn)

賺錢了

2021-07-09

老外的嵌入式編程規(guī)范(值得一看)

2021-07-08

MQTT協(xié)議,終于有人講清楚了

2021-07-05

如何通俗易懂地學習網(wǎng)絡協(xié)議?

2021-07-06


原創(chuàng)不易,歡迎轉(zhuǎn)發(fā)、留言、點贊、分享給你的朋友,感謝您的支持!

長按識別二維碼關注我


你點的每個好看,我都認真當成了喜歡

本站聲明: 本文章由作者或相關機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉