青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,Linux內核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數據加載中……

探索C++的秘密之一詳解extern "C"

       時常在cpp的代碼之中看到這樣的代碼:

#ifdef __cplusplus
extern "C" {
#endif

//一段代碼

#ifdef __cplusplus
}

#endif


        這樣的代碼到底是什么意思呢?首先,__cplusplus是cpp中的自定義宏,那么定義了這個宏的話表示這是一段cpp的代碼,也就是說,上面的代碼的含義是:如果這是一段cpp的代碼,那么加入extern "C"{和}處理其中的代碼.

        要明白為何使用extern "C",還得從cpp中對函數的重載處理開始說起.在c++中,為了支持重載機制,在編譯生成的匯編碼中,要對函數的名字進行一些處理,加入比如函數的返回類型等等.而在C中,只是簡單的函數名字而已,不會加入其他的信息.也就是說:C++和C對產生的函數名字的處理是不一樣的.

         比如下面的一段簡單的函數,我們看看加入和不加入extern "C"產生的匯編代碼都有哪些變化:

int f(void)
{
    
return 1;
}


       在加入extern "C"的時候產生的匯編代碼是:

    .file    "test.cxx"
    .text
    .align 
2
.globl _f
    .def    _f;    .scl    
2;    .type    32;    .endef
_f:
    pushl    
%ebp
    movl    
%esp, %ebp
    movl    $
1%eax
    popl    
%ebp
    ret


但是不加入了extern "C"之后

 .file "test.cxx"
 .text
 .align 
2
.globl __Z1fv
 .def __Z1fv; .scl 
2; .type 32; .endef
__Z1fv:
 pushl 
%ebp
 movl 
%esp, %ebp
 movl $
1%eax
 popl 
%ebp
 ret


        兩段匯編代碼同樣都是使用gcc -S命令產生的,所有的地方都是一樣的,
唯獨是產生的函數名,一個是_f,一個是__Z1fv.

        OK,明白了加入與不加入extern "C"之后對函數名稱產生的影響,我們繼續我們的討論:為什么需要使用extern "C"呢?
        C++之父在設計C++之時,考慮到當時已經存在了大量的C代碼,為了支持原來的C代碼和已經寫好C庫,需要在C++中盡可能的支持C,而extern "C"就是其中的一個策略.

       試想這樣的情況:一個庫文件已經用C寫好了而且運行得很良好,這個時候我們需要使用這個庫文件,但是我們需要使用C++來寫這個新的代碼.如果這個代碼使用的是C++的方式鏈接這個C庫文件的話,那么就會出現鏈接錯誤.我們來看一段代碼:首先,我們使用C的處理方式來寫一個函數,也就是說假設這個函數當時是用C寫成的:

//f1.c
extern "C"
{
void f1()
{
    
return;
}

}

編譯命令是:gcc -c f1.c -o f1.o   產生了一個叫f1.o的庫文件.
再寫一段代碼調用這個f1函數:

// test.cxx
//這個extern表示f1函數在別的地方定義,這樣可以通過
//編譯,但是鏈接的時候還是需要
//鏈接上原來的庫文件.
extern void f1();

int main()
{
    f1();

    
return 0;
}


通過gcc -c  test.cxx -o test.o 產生一個叫test.o的文件.
然后,我們使用gcc test.o f1.o來鏈接兩個文件,可是出錯了,錯誤的提示是:
test.o(.text + 0x1f):test.cxx: undefine reference to 'f1()'
也就是說,在編譯test.cxx的時候編譯器是使用C++的方式來處理f1()函數的,但是實際上鏈接的庫文件卻是用C的方式來處理函數的,所以就會出現鏈接過不去的錯誤:因為鏈接器找不到函數.
      因此,為了在C++代碼中調用用C寫成的庫文件,就需要用extern "C"來告訴編譯器:這是一個用C寫成的庫文件,請用C的方式來鏈接它們.
      比如,現在我們有了一個C庫文件,它的頭文件是f.h,產生的lib文件是f.lib,那么我們如果要在C++中使用這個庫文件,我們需要這樣寫:

extern "C"
{
#include 
"f.h"
}

回到上面的問題,如果要改正鏈接錯誤,我們需要這樣子改寫test.cxx:

extern "C"
{
extern void f1();
}


int main()
{
    f1();

    
return 0;
}


重新編譯并且鏈接就可以過去了.

總結:C和C++對函數的處理方式是不同的.extern "C"是使C++能夠調用C寫作的庫文件的一個手段,如果要對編譯器提示使用C的方式來處理函數的話,那么就要使用extern "C"來說明.

 

 

 

posted on 2006-01-14 23:52 那誰 閱讀(4947) 評論(12)  編輯 收藏 引用 所屬分類: C\C++

評論

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

寫得不錯。

C++因為函數有很多種,成員函數拉,template函數拉,所以他會對函數名稱進行變換。
C很單純,一般也就是在函數名稱前面加上一個_就好了。
2006-01-16 10:06 | 小明

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

學習哈:)
2006-01-16 17:37 | uestc

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

extern "C"是使C++能夠調用C寫作的庫文件的一個手段
--------------
同樣,extern "C"也是使C能夠調用C++庫文件的一個手段。只不過,C不能直接包含帶extern "C"的C++頭文件,需要用extern聲明一下要使用的函數。
2006-01-19 17:21 | 力為

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

不同編譯器處理這種修飾名的方法是不同的,這就是為什么有些人不喜歡發布類庫的原因,換個編譯器,就只能重新編譯了。
2006-01-22 16:38 | feelapi

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

總結一句話:就是為了方便在C++程序中調用C程序
2006-01-24 17:00 | 流氓

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

這篇好像完整點
http://blog.csdn.net/billyang1983/archive/2006/01/04/570498.aspx
2006-02-25 01:43 | Kemin

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

寫的亂七八糟的,
2006-04-08 14:01 |

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

這篇寫的最好最全
http://blog.csdn.net/keensword/archive/2005/06/23/401114.aspx
2006-05-12 14:21 | mem

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

你好,我們是一家致力于中國互聯網的本地搜索、手機地圖和位置服務的創業型軟件公司。入選2005年最值得關注的50家商業網站(www.mapabc.com)。Google、Sina、微軟、中搜、阿里巴巴、中國移動等著名的公司都是圖盟科技的合作伙伴,因業務需要,需要招聘一些對于C++方面比較熟悉的人,我看了你的blog,希望和你交流一下,如果你有意在北京工作,而且愿意從事一些有挑戰性的工作的話,請將簡歷發送到hyla_he@126.com,我會與你聯系,謝謝
2006-07-05 13:04 | hyla

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

嗷嗷,抱歉,一年前剛剛離開北京現在在深圳,哈~~
2006-07-05 17:34 | 創系

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

@力為


編寫C/C++公用的用extern "C"頭文件也是可以的。
#ifdef __cplusplus
/*
C++專用部分,包括 class聲明, 公共函數的重載等。
*/
extern "C" {
#endif /*__cplusplus*/
/*
C / C++ 公共部分,包括結構聲明,函數聲明,變量聲明。
*/

#ifdef __cplusplus
}
#endif /*__cplusplus*/
2006-08-22 17:27 | yihao

# re: 探索C++的秘密之一詳解extern "C"  回復  更多評論   

http://donna-matura-zoccola.fatte-tun.info
http://dvd-de-cul.culs-ugx.info
http://scopare-cinese-foto.sculaccia-tun.info
http://elle-suce-son-gendre.succhiano-ugx.info
http://brazil-fetish-video.sculaccia-tun.info
http://baise-amatrice.senegalese-ugx.info
http://coppia-trans-escort-romagna.fatte-tun.info
http://video-de-sexe-gratuitement.succhiano-ugx.info
http://pokemon-porno.sculaccia-tun.info
http://video-sexe-amateur-gratuit.senegalese-ugx.info
http://ciccione-scopano.sculaccia-tun.info
http://sexe-amateur-francais.succhiano-ugx.info
http://eva-henger-gratis-porno-video.gradis-tun.info
http://france-sexe-gratuit.culs-ugx.info
http://arrapanti-casalinghe.sculaccia-tun.info
http://telechargement-gratuit-video-sexe-gratuite.senegalese-ugx.info
http://intervista-gay-escort.sculaccia-tun.info
http://gratuit-porno-pute-video.senegalese-ugx.info
http://fotoracconti-erotici-amatoriali.sculaccia-tun.info
http://rencontre-sexe-en-moselle.senegalese-ugx.info
http://racconto-o-storia-porno.gradis-tun.info
http://bresilienne-qui-baise.culs-ugx.info
http://foto-orgia-tettona.fatte-tun.info
http://karine-sexe.culs-ugx.info
http://video-bella-donna-scopata.fatte-tun.info
http://sexe-moselle.culs-ugx.info
http://foto-sesso-vecchio-gratis.gradis-tun.info
http://mangas-land-sexe-gratuit.succhiano-ugx.info
http://sakura-sexy-gratis.fatte-tun.info
http://suce-bite-.com.succhiano-ugx.info
http://sborra-gola.sculaccia-tun.info
http://over-blog-sexe-mature.culs-ugx.info
http://bocchino-hard.fatte-tun.info
http://la-salope-du-jour.succhiano-ugx.info
http://hard-core-video-amatoriale.fatte-tun.info
2007-12-30 08:49 | sdgsdg
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产一区视频在线观看| 亚洲小少妇裸体bbw| 久久久久88色偷偷免费| 亚洲少妇自拍| 午夜亚洲福利在线老司机| 亚洲一区二区在线免费观看视频| 一二三区精品福利视频| 亚洲性感激情| 久久精品观看| 欧美精品免费看| 欧美性色aⅴ视频一区日韩精品| 国产精品久久久久一区| 国产一区二区三区日韩欧美| 亚洲福利在线观看| 一二美女精品欧洲| 午夜精品国产精品大乳美女| 久久久精品久久久久| 欧美成人精品在线视频| 最新69国产成人精品视频免费| 亚洲国产欧美不卡在线观看| 正在播放亚洲| 久久国产乱子精品免费女| 久久综合九色综合欧美就去吻| 亚洲大胆人体视频| 亚洲午夜伦理| 欧美mv日韩mv国产网站app| 国产精品高潮呻吟久久| 国产一区日韩欧美| 亚洲特级毛片| 久久乐国产精品| 亚洲人成网站在线播| 欧美在线资源| 欧美无乱码久久久免费午夜一区| 伊人久久av导航| 午夜久久资源| 欧美激情精品久久久久久黑人| 欧美风情在线| 久久久夜精品| 亚洲一本大道在线| 欧美日韩免费视频| 最新日韩av| 美女成人午夜| 久久成人精品一区二区三区| 欧美日韩国产三级| 樱桃国产成人精品视频| 亚洲视频一二区| 亚洲黄一区二区| 久久香蕉国产线看观看av| 国产精品乱码妇女bbbb| 99精品免费| 亚洲激情自拍| 欧美成人亚洲成人| 在线观看一区视频| 久久九九热免费视频| 亚洲在线播放电影| 国产精品国产| 亚洲专区国产精品| 日韩视频不卡中文| 欧美日本韩国| 一区二区久久| 一本色道88久久加勒比精品| 欧美国产在线观看| 日韩一区二区高清| 亚洲老司机av| 欧美视频三区在线播放| 亚洲一区三区在线观看| 一本色道久久88综合亚洲精品ⅰ| 欧美另类一区二区三区| 99亚洲一区二区| 亚洲视频成人| 国产日韩欧美中文在线播放| 欧美一区二区三区免费大片| 亚洲欧美另类在线观看| 国产精品美女一区二区在线观看| 午夜精品视频在线| 午夜精品影院在线观看| 国模 一区 二区 三区| 久久天天躁狠狠躁夜夜av| 久久琪琪电影院| 99re热精品| 一本久久a久久免费精品不卡| 亚洲人成亚洲人成在线观看图片 | 久久亚洲综合色一区二区三区| 亚洲制服少妇| 国内成人精品一区| 欧美国产日韩一二三区| 欧美激情一级片一区二区| 一区二区三区三区在线| 亚洲欧美综合v| 最新日韩中文字幕| 亚洲精品在线视频观看| 国产农村妇女毛片精品久久莱园子| 久久久噜噜噜久噜久久 | 欧美亚洲免费在线| 久久精品1区| 一本色道久久综合亚洲精品不卡 | 好看的av在线不卡观看| 亚洲第一天堂av| 国产精品视频久久| 亚洲第一精品影视| 国产伦精品一区二区| 欧美激情网友自拍| 国产午夜精品福利| 亚洲区国产区| 狠狠做深爱婷婷久久综合一区| 亚洲美女电影在线| 亚洲大片精品永久免费| 亚洲一区二区视频在线| 亚洲另类一区二区| 久久成人精品无人区| 亚洲线精品一区二区三区八戒| 榴莲视频成人在线观看| 久久高清免费观看| 国产精品久久久久一区| 亚洲国产精品一区二区久| 国产一级揄自揄精品视频| 亚洲精品一区久久久久久| 一区二区三区无毛| 午夜激情综合网| 亚洲欧美中文在线视频| 欧美国内亚洲| 亚洲第一精品夜夜躁人人爽| 伊人成人在线视频| 欧美综合第一页| 久久国内精品自在自线400部| 国产精品高清网站| 亚洲无线视频| 亚洲欧美春色| 国产精品高精视频免费| 99综合在线| 亚洲视频高清| 欧美性猛交xxxx乱大交退制版| 亚洲三级毛片| 亚洲色诱最新| 欧美午夜精品理论片a级按摩| 亚洲精品女av网站| 亚洲国产91| 免费观看成人www动漫视频| 男女精品网站| 亚洲人成在线免费观看| 亚洲国产精品第一区二区| 亚洲高清在线播放| 欧美chengren| 亚洲免费观看在线视频| 亚洲图片欧洲图片日韩av| 欧美日韩裸体免费视频| 99精品99久久久久久宅男| 制服丝袜亚洲播放| 国产精品每日更新| 久久国产福利国产秒拍| 另类激情亚洲| 亚洲人成小说网站色在线| 欧美精品一区二区久久婷婷| 亚洲精品中文字幕在线观看| 亚洲淫性视频| 国内成人精品2018免费看| 欧美1区3d| 一区二区三区免费网站| 久久久久www| 亚洲精品日韩综合观看成人91| 欧美精品日韩一区| 一本一道久久综合狠狠老精东影业 | 欧美日韩国产一级片| 一区二区三区免费观看| 久久久精品动漫| 亚洲精品综合在线| 国产精品视频在线观看| 久久久女女女女999久久| 亚洲国产精品福利| 欧美一区二区精品在线| 尤物99国产成人精品视频| 欧美日韩国产不卡| 欧美一区永久视频免费观看| 老牛嫩草一区二区三区日本| 99精品国产热久久91蜜凸| 国产亚洲精品久久久久久| 欧美高清免费| 欧美专区第一页| 一本色道久久综合狠狠躁篇的优点 | 中国成人在线视频| 国产一区二区三区网站 | 欧美激情一二三区| 欧美一区二区三区喷汁尤物| 亚洲国产精品一区二区第四页av | 亚洲国产专区| 国产色产综合产在线视频| 欧美久久一级| 久久人人爽人人爽爽久久| 亚洲婷婷在线| 亚洲经典自拍| 男女激情久久| 久久免费视频在线| 亚洲欧美在线aaa| 日韩视频中文| 亚洲激情成人网| 在线成人激情| 狠狠久久婷婷| 国产一区二区精品| 亚洲一区三区视频在线观看| 亚洲国产婷婷香蕉久久久久久99 |