C与C++之间相互调用
1、导出C函数以用于C或C++的项目
如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言。如果是从C++语言模块使用,则用C链接声明这些函数。如果使用此技术并为DLL提供头文件,则这些函数可以原封不动地由C和C++模块使用。
以下代码演示可由 C 和 C++ 客户端应用程序使用的头文件:
// 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语言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 function extern "C" void call_Lib_CPPFunction(Lib* p, DataAttribute* dataAttribute) {p->daFun(dataAttribute); } // daFun才是我们C++代码的实现 void Lib::daFun(DataAttribute* dataAttribute) {map<string, MMSINFO>::iterator it;// ... }
C与C++之间相互调用相关推荐
- 前台为html后台是asp在vs2012中建立什么,Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得...
Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得 < type="text/javascript"> < type="text/java ...
- java 多个项目间事物_Java-web-多个独立项目之间相互调用实践
本篇文章只涉及到应用层面,没有涉及到什么底层原理之类的,我目前的实力还没有达到那个级别.如果是大神级别的人看到这篇文章,请跳过. 项目框架也已经是搭建好了的,springboot版本为1.5,数据库操 ...
- Spring Cloud之微服务之间相互调用、如何让一个微服务调用另外一个微服务
在使用微服务架构中,可能遇到一些业务情况会涉及服务之间相互调用,下面通过一个简单的demo给大家演示下,演示的是oms服务需要调用ump服务. 代码如下: 1.oms服务提供者 主要是这个注解: @E ...
- WinCC项目函数之间相互调用
采用WinCC作为上位机框架进行开发工业控制界面,全局脚本中C-Editor进行开发工业控制模型. 我们用C#或者C++时,方法之间调用.类调用等等,比较灵活.其实WinCC和C#或者C++一样. 项 ...
- 子窗体与父窗体之间相互调用其方法的实现
今天下午一直在研究子窗体与父窗体之间怎样实现方法调用,研究了整个下午也算有了一点小成,现在将自己积累的一点经验记录下来: 对于子窗体调用父窗体中的方法可以按如下的方法实现: 1.首先在父窗体中按如下方 ...
- python类之间相互调用_python相互调用
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python调用perl则不需要系统环境:windows7python版本:2. ...
- vue.js html 相互传值,Vue 父子组件之间相互调用传值以及多层组件之间相互调用传值...
一.父子组件传值 要点1:父组件赋予子组件属性值,子组件通过props 来接收值. 要点2:父组件可以通过 子组件对象($ref),来调用子组件的属性以及方法 要点3:子组件通过$emit 来调用父组 ...
- 如何实现CAPP、CMainFrame、CViEW和CDOC之间相互调用?
例如:我在CMainFrame 中写代码,要访问CVIEW类中的数据,该怎么写代码? 在CMainFrame 中,要访问CDOC类中的数据,该怎么写代码? CVIEW类要访问CDOC类中的数据,该怎么 ...
- matlab 文件之间相互调用实例
效果: 找到按钮的回调 function pushbutton1_Callback(hObject, eventdata, handles) cd 'Deploy Nodes' %square_ran ...
最新文章
- pacman 查询_pacman包管理常用命令
- Django 的模板语法之过滤器
- HDOJ 3642 Get The Treasury(扫描线 + 线段树 + 离散化 立方体的并)
- C++继承的概念及语法
- 玩转webpack(一)下篇:webpack的基本架构和构建流程
- linux 进程(一)---基本概念
- 史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)
- tsconfig.json配置
- 二叉树的后续遍历算法实现
- Mac安装MySQLWorkbench
- 【JVM】JVM客户端 server模式 client 模式
- springcloud工作笔记099---springboot集成netty,进行线程管理,socket通讯
- python怎么调用接口失败_python 调用接口
- Atitit java播放mp3 目录 1.1. 不能直接支持mp3播放。。需要解码播放转化为pcm	1 1.2. 使用\javalayer类库播放	3 1.3. ,就是普通的java sound
- python常用字符串_Python中最常用的字符串方法!
- 武汉大学953计算机综合真题,武大电力系统分析实验报告.docx
- wps中有公式如何调整间距
- 调整bandizip压缩参数获得最大压缩效果
- 价格屠夫乐视杀入4K电视市场
- python白鹅类型_关于python鸭子类型和白鹅类型
热门文章
- mongodb常用语句以及SpringBoot中使用mongodb
- 切换apache的prefork和worker模式
- C#中如何获取注册表信息
- Redis源码解析——有序整数集
- DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
- #Java夜未眠# 读书笔记
- java如何被调用_java – 如何知道Parse.initialize()是否已被调用?
- postgres 显示变量_postgre 查询时 postgres=# 变成 ! ! 要怎么解决?
- lammps软件_MAPS软件:让LAMMPS运用更高效 — 特点及实例
- python获取当前进程id_Python进程,多进程,获取进程id,给子进程传递参数操作示例...