C/C++中extern "C" 的作用分析
我們經(jīng)常會(huì)在C/C++程序中見到extern "C",這是一個(gè)很重要的概念。本文就來以實(shí)例形式講述C/C++中extern "C"的作用。分享給大家供大家參考之用。具體分析如下:
作用:實(shí)現(xiàn)C和C++混合編程。
原理:C和C++編譯器編譯之后,函數(shù)名會(huì)編譯成不同的名字,鏈接階段名字查找會(huì)找不到目標(biāo),后面實(shí)例中會(huì)詳解。
用法:
①.c文件中定義的函數(shù),.cpp文件要調(diào)用時(shí),該.cpp文件中要用extern "C"聲明該函數(shù);
②.反過來,.cpp文件中定義的函數(shù),.c文件要調(diào)用,則同樣要在.cpp文件中用extern "C"聲明,.c文件只用普通的extern聲明。
兩個(gè)源文件分別編譯成.o文件,再鏈接成執(zhí)行文件。鏈接.o文件生成執(zhí)行文件時(shí),必須得用g++。
實(shí)例:
在源文件中聲明的,沒有頭文件
.c文件定義的函數(shù),.cpp文件調(diào)用:
//.c文件定義的函數(shù) extern int myadd(int a, int b); int myadd(int a, int b) { return a+b; }
//.cpp文件調(diào)用 #include <iostream> using namespace std; extern "C" int myadd(int a, int b); int main() { cout << myadd(3, 7) << endl; return 0; }
.cpp文件定義的函數(shù),.c文件調(diào)用:
//.cpp文件定義的函數(shù) extern "C" int myadd(int a, int b); int myadd(int a, int b) { return a + b; }
//.c文件調(diào)用 #include <stdio.h> extern int myadd(int a, int b); int main() { printf("%d\n", myadd(3, 7)); return 0; }
如果在頭文件中聲明,則.c文件正常的包含該頭文件,.cpp文件應(yīng)該用
//.cpp文件的包含方式 extern "C" { #include "myHead.h" }
的方式來包含頭文件,該頭文件中聲明的函數(shù)都為C方式編譯。
原理補(bǔ)充:C文件中,上述函數(shù)編譯之后的函數(shù)名為類似于_myadd的形式,而CPP的編譯之后函數(shù)名為類似于_myadd_int_int的形式,因?yàn)镃PP要支持重載,用這種方式來區(qū)別重載的函數(shù)。
相信本文所述對(duì)大家的C++程序設(shè)計(jì)有一定的借鑒價(jià)值。
- c++內(nèi)聯(lián)函數(shù)(inline)使用詳解
- 詳解C++中的內(nèi)聯(lián)函數(shù)和函數(shù)重載
- c++中的內(nèi)聯(lián)函數(shù)inline用法實(shí)例
- c++ 內(nèi)聯(lián)函數(shù)和普通函數(shù)的區(qū)別
- C++編程中隊(duì)內(nèi)聯(lián)函數(shù)的理解和使用
- C++中的extern “C”用法詳解
- C++中的extern聲明變量詳解
- C++中extern "C"的用法
- C/C++ 中extern關(guān)鍵字詳解
- C++入門教程之內(nèi)聯(lián)函數(shù)與extern?"C"詳解
相關(guān)文章
C++如何獲取當(dāng)前系統(tǒng)時(shí)間及格式化輸出
這篇文章主要介紹了C++如何獲取當(dāng)前系統(tǒng)時(shí)間及格式化輸出的實(shí)例代碼,主要用到time()及strftime()函數(shù),通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02C++深入探索類真正的形態(tài)之struct與class
前邊我們所定義的類,均是使用struct關(guān)鍵字來定義,但是C++中真正用于定義類的關(guān)鍵字為class,因?yàn)橐狢++兼容C,所以保留struct關(guān)鍵字,struct與class的用法完全相同2022-04-04C++用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列(面試官的小結(jié))
這篇文章主要給大家介紹了關(guān)于C++用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的相關(guān)資料,這是來自一名面試官的小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05C++實(shí)現(xiàn)簡(jiǎn)單的通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單的通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06opencv3/C++圖像濾波實(shí)現(xiàn)方式
今天小編就為大家分享一篇opencv3/C++圖像濾波實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12C++ 回調(diào)接口設(shè)計(jì)和二進(jìn)制兼容詳細(xì)
再開發(fā)視頻編輯 SDK,SDK的回調(diào)接口設(shè)計(jì)成 C 風(fēng)格,結(jié)構(gòu)中放著一些函數(shù)指針,既然對(duì)外接口是 C++,為什么不直接使用 C++ 的虛函數(shù)?這篇文章便對(duì)這一問題做個(gè)詳細(xì)介紹,需要的朋友可以參考一下2021-09-09