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;// ...
}

作者:阿凡卢
出处:http://www.cnblogs.com/luxiaoxun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
http://www.cnblogs.com/luxiaoxun/p/3405374.html

C与C++之间相互调用相关推荐

  1. 前台为html后台是asp在vs2012中建立什么,Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得...

    Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得 < type="text/javascript"> < type="text/java ...

  2. java 多个项目间事物_Java-web-多个独立项目之间相互调用实践

    本篇文章只涉及到应用层面,没有涉及到什么底层原理之类的,我目前的实力还没有达到那个级别.如果是大神级别的人看到这篇文章,请跳过. 项目框架也已经是搭建好了的,springboot版本为1.5,数据库操 ...

  3. Spring Cloud之微服务之间相互调用、如何让一个微服务调用另外一个微服务

    在使用微服务架构中,可能遇到一些业务情况会涉及服务之间相互调用,下面通过一个简单的demo给大家演示下,演示的是oms服务需要调用ump服务. 代码如下: 1.oms服务提供者 主要是这个注解: @E ...

  4. WinCC项目函数之间相互调用

    采用WinCC作为上位机框架进行开发工业控制界面,全局脚本中C-Editor进行开发工业控制模型. 我们用C#或者C++时,方法之间调用.类调用等等,比较灵活.其实WinCC和C#或者C++一样. 项 ...

  5. 子窗体与父窗体之间相互调用其方法的实现

    今天下午一直在研究子窗体与父窗体之间怎样实现方法调用,研究了整个下午也算有了一点小成,现在将自己积累的一点经验记录下来: 对于子窗体调用父窗体中的方法可以按如下的方法实现: 1.首先在父窗体中按如下方 ...

  6. python类之间相互调用_python相互调用

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python调用perl则不需要系统环境:windows7python版本:2. ...

  7. vue.js html 相互传值,Vue 父子组件之间相互调用传值以及多层组件之间相互调用传值...

    一.父子组件传值 要点1:父组件赋予子组件属性值,子组件通过props 来接收值. 要点2:父组件可以通过 子组件对象($ref),来调用子组件的属性以及方法 要点3:子组件通过$emit 来调用父组 ...

  8. 如何实现CAPP、CMainFrame、CViEW和CDOC之间相互调用?

    例如:我在CMainFrame 中写代码,要访问CVIEW类中的数据,该怎么写代码? 在CMainFrame 中,要访问CDOC类中的数据,该怎么写代码? CVIEW类要访问CDOC类中的数据,该怎么 ...

  9. matlab 文件之间相互调用实例

    效果: 找到按钮的回调 function pushbutton1_Callback(hObject, eventdata, handles) cd 'Deploy Nodes' %square_ran ...

最新文章

  1. pacman 查询_pacman包管理常用命令
  2. Django 的模板语法之过滤器
  3. HDOJ 3642 Get The Treasury(扫描线 + 线段树 + 离散化 立方体的并)
  4. C++继承的概念及语法
  5. 玩转webpack(一)下篇:webpack的基本架构和构建流程
  6. linux 进程(一)---基本概念
  7. 史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)
  8. tsconfig.json配置
  9. 二叉树的后续遍历算法实现
  10. Mac安装MySQLWorkbench
  11. 【JVM】JVM客户端 server模式 client 模式
  12. springcloud工作笔记099---springboot集成netty,进行线程管理,socket通讯
  13. python怎么调用接口失败_python 调用接口
  14. Atitit java播放mp3 目录 1.1. 不能直接支持mp3播放。。需要解码播放转化为pcm 1 1.2. 使用\javalayer类库播放 3 1.3. ,就是普通的java sound
  15. python常用字符串_Python中最常用的字符串方法!
  16. 武汉大学953计算机综合真题,武大电力系统分析实验报告.docx
  17. wps中有公式如何调整间距
  18. 调整bandizip压缩参数获得最大压缩效果
  19. 价格屠夫乐视杀入4K电视市场
  20. python白鹅类型_关于python鸭子类型和白鹅类型

热门文章

  1. mongodb常用语句以及SpringBoot中使用mongodb
  2. 切换apache的prefork和worker模式
  3. C#中如何获取注册表信息
  4. Redis源码解析——有序整数集
  5. DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
  6. #Java夜未眠# 读书笔记
  7. java如何被调用_java – 如何知道Parse.initialize()是否已被调用?
  8. postgres 显示变量_postgre 查询时 postgres=# 变成 ! ! 要怎么解决?
  9. lammps软件_MAPS软件:让LAMMPS运用更高效 — 特点及实例
  10. python获取当前进程id_Python进程,多进程,获取进程id,给子进程传递参数操作示例...