当前位置: 首页 > 编程日记 > 正文

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;// ...
}
复制代码

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

相关文章:

【MATLAB】三维图形的绘制mesh

步骤如下&#xff1a; &#xff08;1&#xff09;确定自变量x和y的取值范围和取值间隔 x x1 :dx :x2 , y y1 : dy : y2 &#xff08;2&#xff09;构成xoy平面上的自变量采样“格点”矩阵 ①利用格点矩阵的原理生成矩阵。 xx1:dx:x2; yy1:dy:y2; Xones(size(y))*x; Yy*o…

ORA-01919: role 'PLUSTRACE' does not exist

环境&#xff1a;Oracle 10g,11g.现象&#xff1a;在一次迁移测试中&#xff0c;发现有这样的角色赋权会报错不存在&#xff1a; SYSorcl> grant PLUSTRACE to jingyu; grant PLUSTRACE to jingyu* ERROR at line 1: ORA-01919: role PLUSTRACE does not exist 查询发现这个…

Java反射以及应用

需求&#xff1a;需要通过反射动态获取类的字段类型&#xff0c;然后做特殊处理 Java反射getDeclaredField和getField的区别 getDeclaredFiled 只能获取类本身的属性成员&#xff08;包括私有、共有、保护&#xff09; getField 仅能获取类(及其父类可以自己测试) public属性…

【MATLAB】雅可比矩阵jacobi matrix

参考页面&#xff1a; https://baike.baidu.com/item/%E9%9B%85%E5%8F%AF%E6%AF%94%E7%9F%A9%E9%98%B5/10753754?fraladdin#1 在向量微积分中&#xff0c;雅可比矩阵是一阶偏导数以一定方式排列成的矩阵&#xff0c;其行列式称为雅可比行列式。 由球坐标系到直角坐标系的转…

Laravel:使用Migrations

1、首先利用artisan创建一个可迁移的数据表模板&#xff0c;该命令运行后会在database/migrations目录下生成一个文件 php artisan make:migration create_fees_count_table --createfees_count 2、生成的文件包含up和down两个方法&#xff0c;其中up中是包含了添加表&#xff…

基于libevent和unix domain socket的本地server

https://www.pacificsimplicity.ca/blog/libevent-echo-server-tutorial 根据这一篇写一个最简单的demo。然后开始写client。 client调优 client最初的代码如下&#xff1a; 1 #include <sys/socket.h>2 #include <sys/un.h>3 #include <stdio.h>4 #include …

软件体系架构模式之一什么是软件架构模式

什么是软件架构模式 计划启动未开发的软件项目&#xff1f;然后选择正确的架构模式将对项目的结果起关键作用。选择市场上最流行或最新的技术并不总是意味着会带来最好的结果。但是&#xff0c;选择最合适的解决方案将为行之有效的问题和反复出现的问题提供可靠的解决方案。 …

HP 服务器 iLO 远程控制软件 介绍

iLO了解&#xff1a;iLO 是一组芯片&#xff0c;内部是vxworks的嵌入操作系统,在服务器的背后有一个标准RJ45口对外连接生产用交换机或者带外管理的交换机。iLO 全名是 Integrated Lights-out&#xff0c;它是惠普某些型号的服务器上集成的远程管理端口&#xff0c;它能够允许用…

【MATLAB】数据分析之数据插值

插值&#xff1a;求过已知有限个数据点的近似函数。 区别于拟合&#xff1a; 拟合&#xff1a;已知有限个数据点求近似函数&#xff0c;不要求过已知数据点&#xff0c;只要求在某种意义下它在这些点上的总偏差最小。 基本常用的插值方法&#xff1a;拉格朗日多项式插值&…

迈斯!啊呸~数学

1.数论 快速幂 int po(int x,int y) {int ans1;while(y){if(y%21)ans1ll*ans*x%p;x1ll*x*x%p;y/2;}return ans; } 乘法逆元&#xff08;保证模域p与求逆元的数互质&#xff09; po(a,p-2);//a为需要求逆元的数 扩展欧几里得&#xff08;exgcd&#xff09; #include<cstdio&g…

软件体系架构模式之二分层体系结构

分层体系结构模式是n层模式&#xff0c;其中组件被组织在水平层中。这是设计大多数软件的传统方法&#xff0c;并且具有独立性。这意味着所有组件都是互连的&#xff0c;但彼此之间不依赖。 图1&#xff1a;分层架构 在此体系结构中有四层&#xff0c;其中每一层在模块和其中的…

linux下mysql的root密码忘记解决方法

1&#xff0e;首先确认服务器出于安全的状态&#xff0c;最安全的状态是到服务器的Console上面操作&#xff0c;并且拔掉网线&#xff0c;或者可以使用--skip-networking限制只能从本地连接2&#xff0e;修改MySQL的登录设置&#xff1a; # vim /etc/my.cnf在[mysqld]的段中加上…

【Python】turtle库的小应用

心血来潮&#xff0c;哈哈哈&#xff0c;画的不好&#xff0c;请多见谅 大家如果想要尝试turtle库&#xff0c;可以借鉴&#xff1a; https://www.cnblogs.com/nowgood/p/turtle.html 导入库&#xff0c;我的pycharm里可以直接使用&#xff0c;哈哈哈&#xff0c;不行就pip…

[转]MySQL修改时区的方法小结

本文转自&#xff1a;https://www.cnblogs.com/mracale/p/6064447.html 这篇文章主要介绍了MySQL修改时区的方法,总结分析了三种常见的MySQL时区修改技巧,包括命令行模式、配置文件方式及代码方式,需要的朋友可以参考下 方法一&#xff1a;通过mysql命令行模式下动态修改 1.1 查…

swift轮播图代码

import UIKit private let CycleCellID "CycleCellID" class BannerCycleView: UIView { var layout : UICollectionViewFlowLayout! var collectionView :UICollectionView! var pageContol : UIPageControl? var cycleTimer : Timer? let timeInterval : TimeI…

软件体系架构模式之三微内核体系架构

当您的软件系统或产品包含许多与外部实体的集成点时&#xff0c;微内核体系结构模式将非常有用。最重要的是&#xff0c;您将无法准确判断出将来将哪些实体集成到您的系统中。可以将微内核架构模式识别为基于插件的模式。。也称为插件架构模式&#xff0c;它由两个主要组件组成…

【MATLAB】交互式绘图(ginput,gtext,zoom)

1、ginput指令&#xff1a; [x,y]ginput(n) %&#xff08;其功能是用鼠标从二维图形中获取n个点的数据坐标&#xff09; x-8*pi:pi/100:8*pi; y1sin(x); y24*sin(x/4); plot(x,y1,r-,x,y2,k-); legend(sin(x),4sin(x/4)); grid on; [x,y]ginput(8); %在下方命令窗…

【斗医】【18】Web应用开发20天

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qingkechina.blog.51cto.com/5552198/1544928 本文通过获取首页内容来讲解Web页面拖拽获取当前页数据&#xff0c;功能类似在google查看图…

数据库和缓存一致性的问题

经常看到有人问怎么解决数据库和缓存一致性的问题&#xff0c;这个问题我觉得是不要去解决。 如果你不信你先看我列的几种情况 假设 数据库一开始和缓存都是1元。 用户更新数据库的同时双写缓存。 1.双写不删 写库充值10元>>>返回成功 ----- 时间间隔 <<<…

【MATLAB】数据分析之求函数的极限(limit)

在MATLAB中采用limit函数求某个具体函数的极限&#xff0c;其调用格式如下&#xff1a; limit(expr,x,a)&#xff1a;当xa时&#xff0c;对函数expr求极限&#xff0c;返回值为函数极限。limit(expr)&#xff1a;默认当x0时&#xff0c;对函数expr求极限&#xff0c;返回值为函…

Spring Boot集成Swagger导入YApi@无界编程

接口APi开发现状 现在开发接口都要在类似YApi上写文档&#xff0c;这样方便不同的团队之间协作&#xff0c;同步更新接口&#xff0c;提高效率。 但是如果接口很多&#xff0c;你一个个手工在YApi去录入无疑效率很低。 如果是使用Spring Boot集成Swagger可以直接导入YApi非常…

【MATLAB】数据分析之函数数值积分

一、数值积分问题的数学表达 称为积分节点&#xff0c;称为求积系数。右端公式称为左端定积分的某个数值积分。MATLAB支持三重以下的积分运算。分别为&#xff1a; 在计算积分时&#xff0c;要求积分区间是确定的。 二、一元函数的数值积分 1、quad函数&#xff1a;采用遍历的…

c++对象切片

什么事对象切片&#xff1a;c在将一个派生类转换为基类的过程中&#xff0c;派生类的一部分将被基类接收不到&#xff0c;只能留下基类大小的对象。传值调用的切片&#xff1a;#include<iostream> using namespace std; class Base { public: virtual void func1() { cou…

javascript数据结构与算法-队列

定义 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。进行插入操作的端称为…

Oracle学习笔记十三 触发器

2019独角兽企业重金招聘Python工程师标准>>> 简介 触发器是当特定事件出现时自动执行的存储过程&#xff0c;特定事件可以是执行更新的DML语句和DDL语句&#xff0c;触发器不能被显式调用。 触发器的功能&#xff1a; 1.自动生成数据 2.自定义复杂的安全权限 3.提供…

使用Notepad++比较文件的差异

有时候需要比较两个文件的差异部分&#xff0c;如果不在git里可以使用Notepad的插件。 在Notepad中安装Compare插件 打开NotePad&#xff0c;点击工具栏上的插件--Plugin Manager--Show Plugin Manager&#xff0c;选中Compare 然后安装。 比如下看两个线程堆栈的差异&#xf…

【MATLAB】将向量表示的多项式用字符串输出的通用函数示例

%创建一个名为pprintf的M文件 function s pprintf(p) %UNTITLED7 此处显示有关此函数的摘要 % 此处显示详细说明 if nargin>1error(Too much input arguments); end while(p(1)0)p1[]; end llength(p); if l0s0; elseif l1snum2str(p(1)); elseif l2s strcat(num2str(p(…

30秒或更短的时间内弄懂的有用CSS代码片段

今天无意间看到这个&#xff0c;真的很牛逼&#xff0c;记录下中文网&#xff1a; caibaojian.com/30-seconds-…转载于:https://juejin.im/post/5bf278a85188255e9b61a226

【MATLAB】数据分析之多项式及其函数

1、多项式的表达式和创建 MATLAB中使用一维向量来表示多项式。将多项式按照降幂次序存放在向量中。 多项式就可以用向量 [2 3 5 0 1]来表示。 2、多项式求根 >> p[1 2 1]p 1 2 1>> r roots(p)r -1-13、由根创建多项式 >> r [2;3]r 23>>…

SpringBoot自定义异常源码分析

SpringBoot自定义异常源码分析 在类上加ControllerAdvice注解&#xff0c;在方法上加ExceptionHandler注解&#xff0c;就可以在方法里处理相应的异常。 1.自定义异常处理类AdditionalExceptionHandler 挂RestControllerAdvice注解&#xff1a; ------------------ 2.自定义…