欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

C++中extern "C"的用法

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語言|點(diǎn)擊: 次

學(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++函數(shù)模板與類模板實(shí)例解析

欄    目:C語言

下一篇:C++對(duì)數(shù)組的引用實(shí)例分析

本文標(biāo)題:C++中extern "C"的用法

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3484.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有