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

那誰(shuí)的技術(shù)博客

感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
數(shù)據(jù)加載中……

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

       時(shí)常在cpp的代碼之中看到這樣的代碼:

#ifdef __cplusplus
extern "C" {
#endif

//一段代碼

#ifdef __cplusplus
}

#endif


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

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

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

int f(void)
{
    
return 1;
}


       在加入extern "C"的時(shí)候產(chǎn)生的匯編代碼是:

    .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命令產(chǎn)生的,所有的地方都是一樣的,
唯獨(dú)是產(chǎn)生的函數(shù)名,一個(gè)是_f,一個(gè)是__Z1fv.

        OK,明白了加入與不加入extern "C"之后對(duì)函數(shù)名稱產(chǎn)生的影響,我們繼續(xù)我們的討論:為什么需要使用extern "C"呢?
        C++之父在設(shè)計(jì)C++之時(shí),考慮到當(dāng)時(shí)已經(jīng)存在了大量的C代碼,為了支持原來(lái)的C代碼和已經(jīng)寫好C庫(kù),需要在C++中盡可能的支持C,而extern "C"就是其中的一個(gè)策略.

       試想這樣的情況:一個(gè)庫(kù)文件已經(jīng)用C寫好了而且運(yùn)行得很良好,這個(gè)時(shí)候我們需要使用這個(gè)庫(kù)文件,但是我們需要使用C++來(lái)寫這個(gè)新的代碼.如果這個(gè)代碼使用的是C++的方式鏈接這個(gè)C庫(kù)文件的話,那么就會(huì)出現(xiàn)鏈接錯(cuò)誤.我們來(lái)看一段代碼:首先,我們使用C的處理方式來(lái)寫一個(gè)函數(shù),也就是說(shuō)假設(shè)這個(gè)函數(shù)當(dāng)時(shí)是用C寫成的:

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

}

編譯命令是:gcc -c f1.c -o f1.o   產(chǎn)生了一個(gè)叫f1.o的庫(kù)文件.
再寫一段代碼調(diào)用這個(gè)f1函數(shù):

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

int main()
{
    f1();

    
return 0;
}


通過(guò)gcc -c  test.cxx -o test.o 產(chǎn)生一個(gè)叫test.o的文件.
然后,我們使用gcc test.o f1.o來(lái)鏈接兩個(gè)文件,可是出錯(cuò)了,錯(cuò)誤的提示是:
test.o(.text + 0x1f):test.cxx: undefine reference to 'f1()'
也就是說(shuō),在編譯test.cxx的時(shí)候編譯器是使用C++的方式來(lái)處理f1()函數(shù)的,但是實(shí)際上鏈接的庫(kù)文件卻是用C的方式來(lái)處理函數(shù)的,所以就會(huì)出現(xiàn)鏈接過(guò)不去的錯(cuò)誤:因?yàn)殒溄悠髡也坏胶瘮?shù).
      因此,為了在C++代碼中調(diào)用用C寫成的庫(kù)文件,就需要用extern "C"來(lái)告訴編譯器:這是一個(gè)用C寫成的庫(kù)文件,請(qǐng)用C的方式來(lái)鏈接它們.
      比如,現(xiàn)在我們有了一個(gè)C庫(kù)文件,它的頭文件是f.h,產(chǎn)生的lib文件是f.lib,那么我們?nèi)绻贑++中使用這個(gè)庫(kù)文件,我們需要這樣寫:

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

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

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


int main()
{
    f1();

    
return 0;
}


重新編譯并且鏈接就可以過(guò)去了.

總結(jié):C和C++對(duì)函數(shù)的處理方式是不同的.extern "C"是使C++能夠調(diào)用C寫作的庫(kù)文件的一個(gè)手段,如果要對(duì)編譯器提示使用C的方式來(lái)處理函數(shù)的話,那么就要使用extern "C"來(lái)說(shuō)明.

 

 

 

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

評(píng)論

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

寫得不錯(cuò)。

C++因?yàn)楹瘮?shù)有很多種,成員函數(shù)拉,template函數(shù)拉,所以他會(huì)對(duì)函數(shù)名稱進(jìn)行變換。
C很單純,一般也就是在函數(shù)名稱前面加上一個(gè)_就好了。
2006-01-16 10:06 | 小明

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

學(xué)習(xí)哈:)
2006-01-16 17:37 | uestc

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

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

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

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

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

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

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

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

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

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

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

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

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

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

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

嗷嗷,抱歉,一年前剛剛離開(kāi)北京現(xiàn)在在深圳,哈~~
2006-07-05 17:34 | 創(chuàng)系

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

@力為


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

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

# re: 探索C++的秘密之一詳解extern "C"  回復(fù)  更多評(píng)論   

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>
            亚洲免费影院| 夜夜嗨网站十八久久| 午夜亚洲福利| 欧美成人综合在线| 美女国产一区| 欧美成人免费小视频| 欧美成熟视频| 亚洲国产色一区| 亚洲国产精品久久久久秋霞蜜臀| 欧美激情一区二区久久久| 欧美激情乱人伦| 亚洲国产专区校园欧美| 在线综合亚洲欧美在线视频| 亚洲综合好骚| 麻豆成人综合网| 欧美日韩激情小视频| 国产精品久久影院| 国产视频精品va久久久久久| 韩日成人av| 99精品视频免费全部在线| 亚洲影院免费| 免费影视亚洲| 一区二区三区黄色| 久久激情视频| 欧美日韩另类在线| 在线免费观看成人网| 9色porny自拍视频一区二区| 先锋亚洲精品| 亚洲三级色网| 欧美亚洲午夜视频在线观看| 牛人盗摄一区二区三区视频| 国产精品成人观看视频免费| 黄色在线一区| 午夜精品久久久久影视| 欧美高清视频www夜色资源网| 亚洲一区二区精品视频| 久久精品日产第一区二区三区| 亚洲国产婷婷| 欧美一区二区黄色| 亚洲欧洲精品一区二区精品久久久| 日韩亚洲国产精品| 欧美bbbxxxxx| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美综合国产| 亚洲国产老妈| 久久亚洲一区二区三区四区| 国产亚洲精品bt天堂精选| 一区二区三区精密机械公司| 欧美激情欧美狂野欧美精品| 欧美一区午夜精品| 国产精品国产三级国产aⅴ浪潮 | 久久国产精品第一页| 亚洲精品少妇网址| 你懂的视频欧美| 亚洲高清av| 欧美大片一区| 欧美大片免费| 99在线精品观看| 亚洲国产精品一区二区尤物区| 久久av资源网站| 红桃视频成人| 媚黑女一区二区| 久久久精品日韩欧美| 国内精品久久久久久久影视麻豆| 午夜精品在线| 欧美一区二区久久久| 国产日韩欧美中文| 亚洲免费观看| 99re热这里只有精品免费视频| 欧美国产激情二区三区| 一区二区日韩免费看| 一本大道久久a久久精二百| 欧美日韩美女在线| 99精品国产在热久久婷婷| 在线观看的日韩av| 欧美777四色影视在线| 欧美一级二级三级蜜桃| 国产日本亚洲高清| 久久精品国产2020观看福利| 亚洲欧美日韩中文在线制服| 国产乱人伦精品一区二区| 久久精品99无色码中文字幕| 久久人人爽国产| 日韩亚洲欧美一区| 日韩午夜在线视频| 国产亚洲激情| 亚洲成人在线网| 国产精品www.| 毛片精品免费在线观看| 欧美激情在线有限公司| 欧美一区免费| 美女在线一区二区| 亚洲女女做受ⅹxx高潮| 欧美影院在线播放| 91久久精品日日躁夜夜躁国产| 亚洲精品日韩一| 国产日韩欧美视频在线| 亚洲国产精品ⅴa在线观看| 国产精品久久久久三级| 久久亚洲国产精品日日av夜夜| 欧美成人自拍视频| 欧美一区二区在线视频| 欧美成人69| 六十路精品视频| 国产精品久久久一区二区| 久久久久在线| 欧美午夜宅男影院| 男女激情久久| 国产亚洲aⅴaaaaaa毛片| 亚洲精品久久久久久久久| 黄色成人免费观看| 亚洲免费在线看| 一本色道久久综合亚洲二区三区| 久久爱www久久做| 亚洲欧美激情一区| 欧美激情一区二区三区高清视频| 久久久噜噜噜久久狠狠50岁| 欧美片第一页| 亚洲电影激情视频网站| 国外视频精品毛片| 午夜精品久久久久久99热| 亚洲性夜色噜噜噜7777| 麻豆精品网站| 欧美va亚洲va香蕉在线| 国产日韩欧美在线播放| 亚洲在线免费观看| 亚洲欧美成人在线| 欧美日韩国产三区| 亚洲国产婷婷| 91久久国产精品91久久性色| 久久久久久久999精品视频| 午夜亚洲福利在线老司机| 免费日韩视频| 欧美激情精品久久久久久变态| 欧美日本亚洲韩国国产| 六月丁香综合| 一区免费视频| 久久久久久欧美| 久久亚洲视频| 国产一区欧美日韩| 欧美在线精品免播放器视频| 亚洲精选国产| 一区二区三区 在线观看视频| 亚洲欧美视频在线观看视频| 亚洲裸体在线观看| 麻豆freexxxx性91精品| 葵司免费一区二区三区四区五区| 国产视频综合在线| 欧美在线观看视频| 久久午夜影视| 在线成人免费视频| 欧美成人精品一区二区三区| 欧美激情网友自拍| 亚洲伦理一区| 国产精品久久久99| 欧美亚洲视频一区二区| 久热这里只精品99re8久| 亚洲盗摄视频| 欧美精品一区视频| 亚洲你懂的在线视频| 久久高清免费观看| 亚洲国产经典视频| 欧美日韩亚洲91| 西西人体一区二区| 亚洲福利国产| 亚洲性av在线| 国外成人免费视频| 免费在线观看精品| 9色porny自拍视频一区二区| 欧美一区二区三区视频在线| 精久久久久久| 欧美日韩福利在线观看| 亚洲欧美美女| 亚洲国产高清一区二区三区| 亚洲欧美日韩国产综合在线| 国产一区二区三区直播精品电影| 狂野欧美激情性xxxx欧美| 日韩视频专区| 久久久午夜精品| 亚洲午夜性刺激影院| 狠狠v欧美v日韩v亚洲ⅴ| 欧美激情精品| 欧美在线观看一二区| 亚洲精选久久| 欧美高清影院| 久久精品免费播放| 亚洲深夜福利网站| 尤物yw午夜国产精品视频| 国产精品久久久久久av福利软件| 久久一区中文字幕| 中日韩美女免费视频网站在线观看| 欧美14一18处毛片| 先锋影音久久久| 一本色道久久综合狠狠躁篇怎么玩| 有码中文亚洲精品| 国产一区二区精品久久| 国产精品扒开腿做爽爽爽视频 | 一区二区精品| 欧美一区二区在线观看| 亚洲神马久久|