C++中extern "C"的用法
學(xué)習(xí)過C++的人都知道,extern關(guān)鍵字可以置于變量或者函數(shù)前,以標(biāo)示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。這里起到的是聲明作用范圍的用處。另外,extern還可以與”C”連用,作為鏈接指示。本文就此進(jìn)行實(shí)例說明如下:
一、C++名字修飾(Name Mangling)
首先需要從C++的重載說起,在C++中函數(shù)重載指的是幾個(gè)函數(shù)的函數(shù)名相同,參數(shù)列表不同。那么當(dāng)生成obj中間文件/目標(biāo)文件的時(shí)候,C++編譯器如何區(qū)分這幾個(gè)重載函數(shù)呢?可以通過把原函數(shù)名與參數(shù)信息結(jié)合,產(chǎn)生一個(gè)獨(dú)特的內(nèi)部名字,這種技術(shù)叫做名字修飾(Name Mangling)。名字修飾規(guī)則沒有一個(gè)標(biāo)準(zhǔn),所以不同的編譯器的名字修飾規(guī)則也不一樣。
下面是一組函數(shù),其中f()函數(shù)重載了:
int f (void) { return 1; } int f (int) { return 0; } void g (void) { int i = f(), j = f(0); }
f(void)和f(int)是不同的函數(shù),除了函數(shù)名相同以外沒有任何關(guān)系。當(dāng)生成obj目標(biāo)文件時(shí),為了區(qū)分它們,C++編譯器根據(jù)參數(shù)信息進(jìn)行了名字修飾:
int __f_v (void) { return 1; } int __f_i (int) { return 0; } void __g_v (void) { int i = __f_v(), j = __f_i(0); }
注意g()也被名字修飾了,雖然沒有任何名字沖突。名字修飾應(yīng)用于C++的任何符號(hào)。
二、為什么要使用extern “C”?
C語言中沒有名字修飾(Name Mangling),因?yàn)镃語言不支持函數(shù)重載。但是如果C++中含有C代碼,在編譯時(shí)C++編譯器對(duì)C代碼的函數(shù)也會(huì)進(jìn)行名字修飾,函數(shù)名變了以后,將導(dǎo)致在C運(yùn)行庫中找不到對(duì)應(yīng)函數(shù),發(fā)生鏈接錯(cuò)誤。
// 將下面的代碼保存為.cpp文件,并用C++編譯器編譯 int printf(const char *format,...); int main() { printf("GeeksforGeeks"); return 0; }
輸出:
/tmp/ccQBO9Im.o:在函數(shù)‘main'中: test.cpp:(.text+0xf):對(duì)‘printf(char const*, ...)'未定義的引用 collect2: 錯(cuò)誤:ld 返回 1
為了防止C++編譯器對(duì)C代碼進(jìn)行名字修飾,我們將C代碼用extern “C”進(jìn)行鏈接指定,告訴編譯器,在生成中間文件時(shí),不要對(duì)這部分代碼進(jìn)行名字修飾,而是生成符合C規(guī)則的中間符號(hào)名。
extern "C" { int printf(const char *format,...); } int main() { printf("Hello!"); return 0; }
添加了extern “C”鏈接指示后,上面的代碼就能夠正常運(yùn)行了。
附:所有的C風(fēng)格的頭文件(stdio.h, string.h, … 等等)都有在extern “C”下聲明,形式如下:
#ifdef __cplusplus extern "C" { #endif /* Declarations of this file */ #ifdef __cplusplus } #endif
欄 目:C語言
下一篇:C++對(duì)數(shù)組的引用實(shí)例分析
本文標(biāo)題:C++中extern "C"的用法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3484.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery