日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
你真的知道C語言里Extern "C" 的作用嗎?

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

創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)前進(jìn),十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

我經(jīng)常在C語言的頭文件中看到下面的代碼:

 
 
 
 
  1. #ifdef __cplusplus 
  2. extern "C" { 
  3. #endif 
  4.  
  5. // all of your legacy C code here 
  6.  
  7. #ifdef __cplusplus 
  8. #endif 

這通常用于C++和C混合編程的時(shí)候,為了防止C++的編譯器在編譯C文件的時(shí)候出現(xiàn)錯(cuò)誤;

眾所周知,C++可以進(jìn)行函數(shù)名重載,但是C則沒有這種功能,那這和extern "C"又有什么關(guān)系呢?

先看下面這個(gè)表格,如下所示;

語言描述
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

 
 
 
 
  1. #ifndef TEST_H 
  2. #define TEST_H 
  3.  
  4. void foo1(void); 
  5. void foo2(void); 
  6. void foo3(int i); 
  7.  
  8. #endif 

test.c

 
 
 
 
  1. void foo1(void){} 
  2. void foo2(void) {} 
  3. void foo3(int i){} 
  4.  
  5. int main(int argc,char** argv){ 
  6.   
  7.  foo1(); 
  8.  foo2(); 
  9.  foo3(1);  
  10.  return 0; 

編譯這兩個(gè)文件,生成test.o文件,通過objdump查看函數(shù)符號(hào);

 
 
 
 
  1. g++ -c test.c test.h 
  2. objdump -t test.o 

可以看到函數(shù)符號(hào)已經(jīng)被編譯器修改了;

添加extern "C"

test.h

 
 
 
 
  1. #ifndef TEST_H 
  2. #define TEST_H 
  3.  
  4. #ifdef __cplusplus 
  5. extern "C" { 
  6. #endif 
  7. void foo1(void); 
  8. void foo2(void); 
  9. void foo3(int i); 
  10.  
  11. #ifdef __cplusplus 
  12. #endif 
  13.  
  14. #endif 

test.c

 
 
 
 
  1. #ifdef __cplusplus 
  2. extern "C" { 
  3. #endif 
  4. void foo1(void){} 
  5. void foo2(void) {} 
  6. void foo3(int i){} 
  7. #ifdef __cplusplus 
  8. #endif 
  9.  
  10. int main(int argc,char** argv){ 
  11.   
  12.  foo1(); 
  13.  foo2(); 
  14.  foo3(1);  
  15.  return 0; 

編譯這兩個(gè)文件,生成test.o文件,通過objdump查看函數(shù)符號(hào);

 
 
 
 
  1. g++ -c test.c test.h 
  2.  
  3. objdump -t test.o 

這時(shí)候函數(shù)符號(hào)是正確的;

extern "C" 是告訴C++的編譯器不要打我這些C函數(shù)的主意。

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

本文轉(zhuǎn)載自微信公眾號(hào)「小麥大叔」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系小麥大叔公眾號(hào)。


網(wǎng)頁題目:你真的知道C語言里Extern "C" 的作用嗎?
瀏覽地址:http://www.dlmjj.cn/article/cooijii.html