C與C++之間相互調(diào)用實(shí)例方法講解
1、導(dǎo)出C函數(shù)以用于C或C++的項(xiàng)目
如果使用C語(yǔ)言編寫(xiě)的DLL,希望從中導(dǎo)出函數(shù)給C或C++的模塊訪(fǎng)問(wèn),則應(yīng)使用 __cplusplus 預(yù)處理器宏確定正在編譯的語(yǔ)言。如果是從C++語(yǔ)言模塊使用,則用C鏈接聲明這些函數(shù)。如果使用此技術(shù)并為DLL提供頭文件,則這些函數(shù)可以原封不動(dòng)地由C和C++模塊使用。
以下代碼演示可由 C 和 C++ 客戶(hù)端應(yīng)用程序使用的頭文件:
// MyCFuncs.h
#ifdef __cplusplus
extern "C" { // only need to export C interface if
// used by C++ source code
#endif
__declspec( dllimport ) void MyCFunc();
__declspec( dllimport ) void AnotherCFunc();
#ifdef __cplusplus
}
#endif
MyCFunc()和AnotherCFunc()為C語(yǔ)言DLL的導(dǎo)出函數(shù)。
如果需要將C函數(shù)鏈接到C++可執(zhí)行文件,并且函數(shù)聲明頭文件沒(méi)有使用上面的技術(shù),則在C++源文件中添加下列內(nèi)容以防止編譯器修飾C函數(shù)名:
extern "C"
{
#include "MyCHeader.h"
}
該代碼告訴編譯器"MyCHeader.h"是C寫(xiě)的,不要修飾頭文件中的C函數(shù)名,否則連接的時(shí)候會(huì)找不到。
2、導(dǎo)出 C++ 函數(shù)以用于C語(yǔ)言項(xiàng)目
如果在用C++編寫(xiě)的DLL中有希望從C語(yǔ)言模塊訪(fǎng)問(wèn)的函數(shù),應(yīng)使用C鏈接而不是C++鏈接來(lái)聲明這些函數(shù)。除非另外指定,C++編譯器使用C++類(lèi)型安全命名約定(也稱(chēng)作名稱(chēng)修飾)和C++調(diào)用約定(使用此調(diào)用約定從C調(diào)用會(huì)很困難)。
若要指定 C 鏈接,請(qǐng)?jiān)贒LL中為函數(shù)聲明指定 extern "C"。例如:
extern "C" __declspec( dllexport ) int MyFunc(long parm1);
在C語(yǔ)言的函數(shù)中是無(wú)法直接調(diào)用C++代碼的,如果要調(diào)用,可以做一個(gè)wrapper,例如call_Lib_CPPFunction,它的聲明和實(shí)現(xiàn)如下:
// wrapper function
extern "C" void call_Lib_CPPFunction(Lib* p, DataAttribute* dataAttribute)
{
p->daFun(dataAttribute);
}
// daFun才是我們C++代碼的實(shí)現(xiàn)
void Lib::daFun(DataAttribute* dataAttribute)
{
map<string, MMSINFO>::iterator it;
// ...
}
相關(guān)文章
c++ map索引不存在的key可能導(dǎo)致的后果分析
這篇文章主要介紹了c++ map索引不存在的key可能導(dǎo)致的后果分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
C++的template模板中class與typename關(guān)鍵字的區(qū)別分析
這篇文章中我們來(lái)談一談C++的template模板中class與typename關(guān)鍵字的區(qū)別分析,同時(shí)會(huì)講到嵌套從屬名稱(chēng)時(shí)的一些注意點(diǎn),需要的朋友可以參考下2016-06-06
opencv3/C++實(shí)現(xiàn)光流點(diǎn)追蹤
今天小編就為大家分享一篇opencv3/C++實(shí)現(xiàn)光流點(diǎn)追蹤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
C語(yǔ)言實(shí)現(xiàn)手寫(xiě)紅黑樹(shù)的示例代碼
紅黑樹(shù)在表意上就是一棵每個(gè)節(jié)點(diǎn)帶有顏色的二叉搜索樹(shù),并通過(guò)對(duì)節(jié)點(diǎn)顏色的控制,使該二叉搜索樹(shù)達(dá)到盡量平衡的狀態(tài)。本文主將用C語(yǔ)言實(shí)現(xiàn)手寫(xiě)紅黑樹(shù),需要的可以參考一下2022-09-09
詳解vs2022創(chuàng)建及調(diào)用.lib的方法
這篇文章主要介紹了vs2022創(chuàng)建及調(diào)用.lib的方法,調(diào)用Lib的原則就是可以讓編譯器找到頭文件和庫(kù)文件的目錄,并正確引入,本文給大家詳細(xì)講解需要的朋友可以參考下2022-11-11
簡(jiǎn)要對(duì)比C語(yǔ)言中的dup()函數(shù)和dup2()函數(shù)
這篇文章主要介紹了簡(jiǎn)要對(duì)比C語(yǔ)言中的dup()函數(shù)和dup2()函數(shù),是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08

