最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中extern "C"的用法

 更新時間:2014年08月14日 16:54:21   投稿:shichen2014  
這篇文章主要介紹了C++中extern "C"的用法,是深入理解C++所應該掌握的概念,需要的朋友可以參考下

學習過C++的人都知道,extern關(guān)鍵字可以置于變量或者函數(shù)前,以標示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時在其他模塊中尋找其定義。這里起到的是聲明作用范圍的用處。另外,extern還可以與”C”連用,作為鏈接指示。本文就此進行實例說明如下:

一、C++名字修飾(Name Mangling)

首先需要從C++的重載說起,在C++中函數(shù)重載指的是幾個函數(shù)的函數(shù)名相同,參數(shù)列表不同。那么當生成obj中間文件/目標文件的時候,C++編譯器如何區(qū)分這幾個重載函數(shù)呢?可以通過把原函數(shù)名與參數(shù)信息結(jié)合,產(chǎn)生一個獨特的內(nèi)部名字,這種技術(shù)叫做名字修飾(Name Mangling)。名字修飾規(guī)則沒有一個標準,所以不同的編譯器的名字修飾規(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)系。當生成obj目標文件時,為了區(qū)分它們,C++編譯器根據(jù)參數(shù)信息進行了名字修飾:

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()也被名字修飾了,雖然沒有任何名字沖突。名字修飾應用于C++的任何符號。

二、為什么要使用extern “C”?

C語言中沒有名字修飾(Name Mangling),因為C語言不支持函數(shù)重載。但是如果C++中含有C代碼,在編譯時C++編譯器對C代碼的函數(shù)也會進行名字修飾,函數(shù)名變了以后,將導致在C運行庫中找不到對應函數(shù),發(fā)生鏈接錯誤。

// 將下面的代碼保存為.cpp文件,并用C++編譯器編譯 
int printf(const char *format,...); 
  
int main() 
{ 
  printf("GeeksforGeeks"); 
  return 0; 
}

輸出:

/tmp/ccQBO9Im.o:在函數(shù)‘main'中: 
test.cpp:(.text+0xf):對‘printf(char const*, ...)'未定義的引用 
collect2: 錯誤:ld 返回 1 

為了防止C++編譯器對C代碼進行名字修飾,我們將C代碼用extern “C”進行鏈接指定,告訴編譯器,在生成中間文件時,不要對這部分代碼進行名字修飾,而是生成符合C規(guī)則的中間符號名。

extern "C" 
{ 
  int printf(const char *format,...); 
} 
 
int main() 
{ 
  printf("Hello!"); 
  return 0; 
}

添加了extern “C”鏈接指示后,上面的代碼就能夠正常運行了。

附:所有的C風格的頭文件(stdio.h, string.h, … 等等)都有在extern “C”下聲明,形式如下:

#ifdef __cplusplus  
extern "C" { 
#endif 
  /* Declarations of this file */ 
#ifdef __cplusplus 
} 
#endif

相關(guān)文章

  • 華為面試題答案找出最大長度子字符串

    華為面試題答案找出最大長度子字符串

    找出最大長度子字符串,打印并且返回長度。 例如 str = "abc123abcd234abcdefgha324adsdawqdasdaseqqwe345abchded",看下面的代碼實現(xiàn)吧
    2013-12-12
  • C語言掃雷詳細代碼分步實現(xiàn)流程

    C語言掃雷詳細代碼分步實現(xiàn)流程

    掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會,幾次調(diào)試之后,發(fā)現(xiàn)這個比三子棋要復雜一些,尤其是空白展開算法上和堵截玩家有的一拼,與實際游戲差別較大,不能使用光標,下面來詳解每一步分析
    2022-02-02
  • 詳解C語言的隨機數(shù)生成及其相關(guān)題目

    詳解C語言的隨機數(shù)生成及其相關(guān)題目

    這篇文章主要介紹了詳解C語言的隨機數(shù)生成及其相關(guān)題目,作者還列舉了阿里巴巴的一道相關(guān)的面試題,需要的朋友可以參考下
    2015-08-08
  • C語言實現(xiàn)影院管理系統(tǒng)

    C語言實現(xiàn)影院管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)影院管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++小利器之std::bind參數(shù)綁定包裝器的使用詳解

    C++小利器之std::bind參數(shù)綁定包裝器的使用詳解

    從 C++11 開始,標準庫提供了 std::bind 用于綁定函數(shù) f 和調(diào)用參數(shù),返回一個新可調(diào)用函數(shù)對象 fn,下面就跟隨小編一起深入了解一下std::bind的具體使用吧
    2023-12-12
  • C語言實現(xiàn)簡單的文本編輯器

    C語言實現(xiàn)簡單的文本編輯器

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的文本編輯器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++模擬實現(xiàn)string的方法詳解

    C++模擬實現(xiàn)string的方法詳解

    標準庫類型string表示可變長的字符序列,使用string類型必須首先包含string的頭文件。本文將利用C++模擬實現(xiàn)string,需要的可以參考一下
    2022-11-11
  • Qt+Opencv實現(xiàn)梯度矯正功能

    Qt+Opencv實現(xiàn)梯度矯正功能

    這篇文章主要為大家詳細介紹了Qt如何結(jié)合Opencv實現(xiàn)梯度矯正功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-04-04
  • c++中.dll與.lib文件的生成與使用的詳解

    c++中.dll與.lib文件的生成與使用的詳解

    本篇文章介紹了,在c++中.dll與.lib文件的生成與使用的詳細介紹,需要的朋友參考下
    2013-05-05
  • C++?set的使用示例詳解

    C++?set的使用示例詳解

    序列式容器如vector、list等存儲數(shù)據(jù)的邏輯結(jié)構(gòu)為線性序列,元素的存儲和訪問是按位置順序進行的,而關(guān)聯(lián)式容器如set、map等,本文給大家介紹C++?set的使用示例詳解,感興趣的朋友一起看看吧
    2024-10-10

最新評論

怀仁县| 河东区| 湘乡市| 友谊县| 宁化县| 开封市| 荆门市| 南靖县| 会理县| 满洲里市| 定西市| 建始县| 辽宁省| 天台县| 内江市| 酒泉市| 沾益县| 隆尧县| 灵武市| 芮城县| 垣曲县| 山阳县| 余庆县| 桓台县| 公安县| 宿州市| 滨州市| 海盐县| 鸡泽县| 乌鲁木齐县| 库尔勒市| 平阳县| 临泉县| 福州市| 云梦县| 深州市| 玉门市| 沐川县| 抚顺市| 聂荣县| 黑水县|