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

A Za, A Za, Fighting...

堅信:勤能補(bǔ)拙

#ifdef __cplusplus 是什么意思?

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

#ifdef __cplusplus
extern "C" {
#endif

//一段代碼

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

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

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

int f(void)
{
return 1;
}
  在加入extern "C"的時候產(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ù)名,一個是_f,一個是__Z1fv。

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

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

//f1.c
extern "C"
{
void f1()
{
return;
}
}
  編譯命令是:gcc -c f1.c -o f1.o 產(chǎn)生了一個叫f1.o的庫文件。再寫一段代碼調(diào)用這個f1函數(shù):

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

int main()
{
f1();

return 0;
}
  通過gcc -c test.cxx -o test.o 產(chǎn)生一個叫test.o的文件。然后,我們使用gcc test.o f1.o來鏈接兩個文件,可是出錯了,錯誤的提示是:

test.o(.text + 0x1f):test.cxx: undefine reference to 'f1()'
  也就是說,在編譯test.cxx的時候編譯器是使用C++的方式來處理f1()函數(shù)的,但是實際上鏈接的庫文件卻是用C的方式來處理函數(shù)的,所以就會出現(xiàn)鏈接過不去的錯誤:因為鏈接器找不到函數(shù)。

  因此,為了在C++代碼中調(diào)用用C寫成的庫文件,就需要用extern "C"來告訴編譯器:這是一個用C寫成的庫文件,請用C的方式來鏈接它們。

  比如,現(xiàn)在我們有了一個C庫文件,它的頭文件是f.h,產(chǎn)生的lib文件是f.lib,那么我們?nèi)绻贑++中使用這個庫文件,我們需要這樣寫:

extern "C"
{
#include "f.h"
}
  回到上面的問題,如果要改正鏈接錯誤,我們需要這樣子改寫test.cxx:

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

int main()
{
f1();

return 0;
}
  重新編譯并且鏈接就可以過去了.

  總結(jié)

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

posted on 2011-05-22 17:57 simplyzhao 閱讀(286) 評論(0)  編輯 收藏 引用 所屬分類: Z_小小知識點


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

統(tǒng)計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品国产三级国产普通话99| 亚洲成人自拍视频| 国产伦精品一区二区三区高清| 欧美日韩999| 欧美女人交a| 欧美日韩视频一区二区三区| 欧美日韩一区免费| 欧美尤物一区| 亚洲国产精品黑人久久久| 亚洲国产美女久久久久| 欧美激情精品久久久久久黑人| 欧美成人高清| 日韩午夜中文字幕| 亚洲主播在线观看| 久久久99免费视频| 欧美另类久久久品| 国产精品系列在线| 18成人免费观看视频| 日韩午夜电影av| 性做久久久久久| 久热精品在线视频| 日韩午夜视频在线观看| 午夜精品在线| 欧美a级一区| 国产精品毛片a∨一区二区三区|国| 国产日产欧产精品推荐色 | 国产亚洲精品资源在线26u| 国产日韩一区在线| 日韩视频在线观看国产| 欧美一区二区精品在线| 欧美不卡一区| 午夜视频一区在线观看| 欧美乱妇高清无乱码| 国产亚洲永久域名| 宅男精品视频| 欧美成人中文字幕在线| 亚洲在线日韩| 欧美日韩免费一区二区三区| 激情懂色av一区av二区av| 亚洲午夜一区| 亚洲人成网站影音先锋播放| 亚欧美中日韩视频| 欧美视频在线观看 亚洲欧| 亚洲大片在线| 久久色在线播放| 亚洲一区二区三区四区中文 | 亚洲欧美日韩综合国产aⅴ| 欧美激情综合网| 在线观看国产精品网站| 午夜精品电影| 一本久久a久久精品亚洲| 裸体一区二区| 在线看不卡av| 美女免费视频一区| 欧美与欧洲交xxxx免费观看| 亚洲欧美综合一区| 国产乱理伦片在线观看夜一区| 亚洲黄色三级| 免费成人网www| 欧美一区二区视频在线观看2020| 欧美性事免费在线观看| 中文欧美字幕免费| 99精品欧美一区| 欧美日韩日日骚| 中文av一区特黄| 一本久久a久久免费精品不卡| 欧美日本在线视频| 一区二区三区精品国产| 亚洲免费观看高清完整版在线观看| 久久久久久有精品国产| 极品尤物久久久av免费看| 久久久久久久一区| 久久久激情视频| 尤物九九久久国产精品的特点| 久久久久久久久久码影片| 久久精品视频免费观看| 在线看片第一页欧美| 亚洲国产99| 欧美日韩亚洲精品内裤| 亚洲欧美日韩综合国产aⅴ| 亚洲免费中文字幕| 狠狠色综合播放一区二区| 欧美成人a视频| 欧美精品久久久久久久免费观看| 99国产精品99久久久久久粉嫩| 亚洲日本成人女熟在线观看| 亚洲视频一区二区在线观看 | 久久国产婷婷国产香蕉| 国产亚洲福利| 欧美v日韩v国产v| 欧美极品在线播放| 亚洲欧美日韩视频二区| 欧美亚洲一区| 亚洲激情在线播放| 一区二区三区日韩欧美| 国产一区二区三区丝袜| 亚洲第一成人在线| 国产精品入口麻豆原神| 裸体素人女欧美日韩| 欧美日韩国产一级片| 欧美专区在线观看| 欧美精品偷拍| 久久久久久久精| 欧美日韩一区视频| 快射av在线播放一区| 欧美日韩在线不卡一区| 欧美 日韩 国产一区二区在线视频| 欧美一区精品| 美女网站久久| 性一交一乱一区二区洋洋av| 另类成人小视频在线| 午夜精品久久久久久久白皮肤| 久久久久久久综合| 亚洲欧美一区二区三区久久| 亚洲欧美日韩爽爽影院| 激情亚洲网站| 亚洲午夜影视影院在线观看| 亚洲国产一区二区视频| 小黄鸭精品密入口导航| 亚洲午夜电影网| 欧美成人69av| 久久夜色精品国产噜噜av| 欧美性视频网站| 亚洲国产另类久久精品| 伊人成人在线视频| 欧美一区二区三区日韩视频| 亚洲影院污污.| 毛片一区二区三区| 国产精品九九久久久久久久| 国产一区二区视频在线观看| 欧美视频中文字幕| 国产日韩一级二级三级| 国产精品国产a| 欧美一区国产在线| 日韩午夜一区| 亚洲欧美国产77777| 一区二区欧美国产| 亚洲无线观看| 欧美亚洲视频| 亚洲精品一区二区三区四区高清| 久久久综合网| 欧美一区在线看| 欧美极品在线观看| 久久精品在线免费观看| 一区二区三区高清在线| 亚洲国产精品电影在线观看| 亚洲美女诱惑| 欧美一二三区在线观看| 久久亚洲综合色| 国产日韩欧美黄色| 99riav1国产精品视频| 亚洲人成7777| 久久99在线观看| 国产在线国偷精品产拍免费yy| 亚洲综合欧美| 亚洲精品午夜精品| 欧美精品精品一区| 亚洲精选久久| 欧美激情精品| 欧美搞黄网站| 亚洲一区二区三区免费在线观看 | 99视频有精品| 亚洲国产欧美日韩| 一本色道久久综合一区| 99国产精品久久久久久久| 亚洲国产精品va在看黑人| 欧美一级大片在线观看| 欧美一区二区三区视频在线观看| 国产精品美女久久久久久免费| 亚洲一级免费视频| 久热国产精品视频| 亚洲黄色性网站| 亚洲精品1234| 欧美日韩精品久久久| 亚洲视频观看| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲国产天堂久久综合网| 欧美成人免费在线| 中文精品一区二区三区| 久久久亚洲成人| 9国产精品视频| 国产日产精品一区二区三区四区的观看方式 | 久久亚洲私人国产精品va| 亚洲第一主播视频| 欧美视频在线播放| 久久高清一区| 亚洲免费精品| 久久综合中文字幕| 亚洲在线中文字幕| 亚洲二区在线视频| 国产精品天美传媒入口| 欧美成人首页| 亚洲欧美日韩一区二区三区在线观看 | 久久蜜桃资源一区二区老牛| 亚洲欧洲在线看| 欧美在线观看视频在线| 99日韩精品| 亚洲国产一区在线观看| 国产午夜精品美女视频明星a级| 欧美精品在线网站|