博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C与C++之间相互调用
阅读量:6502 次
发布时间:2019-06-24

本文共 1289 字,大约阅读时间需要 4 分钟。

1、导出C函数以用于C或C++的项目

如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言。如果是从C++语言模块使用,则用C链接声明这些函数。如果使用此技术并为DLL提供头文件,则这些函数可以原封不动地由C和C++模块使用。

以下代码演示可由 C 和 C++ 客户端应用程序使用的头文件:

// MyCFuncs.h#ifdef __cplusplusextern "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语言DLL的导出函数。

如果需要将C函数链接到C++可执行文件,并且函数声明头文件没有使用上面的技术,则在C++源文件中添加下列内容以防止编译器修饰C函数名:

extern "C" {#include "MyCHeader.h"}

该代码告诉编译器"MyCHeader.h"是C写的,不要修饰头文件中的C函数名,否则连接的时候会找不到。

2、导出 C++ 函数以用于C语言项目

如果在用C++编写的DLL中有希望从C语言模块访问的函数,应使用C链接而不是C++链接来声明这些函数。除非另外指定,C++编译器使用C++类型安全命名约定(也称作名称修饰)和C++调用约定(使用此调用约定从C调用会很困难)。

若要指定 C 链接,请在DLL中为函数声明指定 extern "C"。例如:

extern "C" __declspec( dllexport ) int MyFunc(long parm1);

在C语言的函数中是无法直接调用C++代码的,如果要调用,可以做一个wrapper,例如call_Lib_CPPFunction,它的声明和实现如下:

// wrapper functionextern "C" void call_Lib_CPPFunction(Lib* p, DataAttribute* dataAttribute) {    p->daFun(dataAttribute);} // daFun才是我们C++代码的实现void Lib::daFun(DataAttribute* dataAttribute){    map
::iterator it; // ...}

 

 

作者:
出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
http://www.cnblogs.com/luxiaoxun/p/3405374.html
你可能感兴趣的文章
如何在webpack+vue项目中使用postcss-px2rem
查看>>
JavaScript DOM 编程艺术 学习笔记01
查看>>
浏览器滚动条高度的获取
查看>>
2017年终总结
查看>>
【Node】简单快捷的图片压缩脚本
查看>>
ZooKeeper系列一:基本概念
查看>>
分布式消息中间件MQ简单介绍
查看>>
React和Redux的连接react-redux
查看>>
Java虚拟机内存管理(五)-垃圾收集器
查看>>
亚洲诚信联合又拍云升级云端SSL证书服务
查看>>
感恩节那天,亚洲诚信收到了一封来自客户的致谢信……
查看>>
网上看到的“12个非常有用的JavaScript技巧”
查看>>
Find系列回归背后,OPPO的探索精神有了新定义?
查看>>
“媒体艺术”如何在自我时代存活
查看>>
SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI
查看>>
java资深架构师分布式技术分享
查看>>
React as a UI Runtime(二、React元素和入口)
查看>>
前端_JavaScript_Vue
查看>>
【跃迁之路】【723天】程序员高效学习方法论探索系列(实验阶段480-2019.2.13)...
查看>>
高性能mongodb之利用javascript函数式编程玩转mongodb shell
查看>>