当前位置:  编程技术>c/c++/嵌入式

C与C++之间相互调用实例方法讲解

    来源: 互联网  发布时间:2014-10-22

    本文导语:  1、导出C函数以用于C或C++的项目 如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言。如果是从C++语言模块使用,则用C链接声明这些函数。如果使用此技术并为DL...

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


    
 
 

您可能感兴趣的文章:

  • windows 和linux 之间的文本文件转换 c和c++文件 批量转换
  • 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
  • C++中Overload,Override,Hide之间的区别
  • C++中基类和派生类之间的转换实例教程
  • C++类中的常数据成员与静态数据成员之间的区别
  • 用标准c++实现string与各种类型之间的转换
  • 调用system(“命令”)和函数调用之间有什么不同?效率?
  • UNIX 操作系统中进程之间调用的通信方式
  • 两个内核模块之间的如何调用变量,函数?
  • 请教!两模块之间如何互相调用
  • EJB新手提问,同一服务器(就是同一容器吧)内EJB之间调用如何处理?
  • 求助panel之间方法调用的问题(非常焦急)
  • JavaBean 之间调用,Bean结构问题?-----急----100分
  • 浅析Activity之间的相互调用
  • 在LINUX操作系统下,在C/C++与FORTRAN两种编程语言之间相互调用问题?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Python3中内置类型bytes和str用法及byte和string之间各种编码转换
  • 求救,linux和windows之间如何联成局域网(设置),并且相互之间移动文件。
  • c/c++中的内存分配 malloc 和 new介绍及相互之间的区别
  • 请问jsp和serlet之间怎么通讯,jsp和jsp之间呢?
  • sql 取两值之间的数据方法(例:100-200之间的数据)
  • 使用ssh-keygen -t rsa建立密钥之后,可以实现两台linux主机之间的root用户免密码登陆。但无法实现两个普通用户之间免密码登陆
  • Linux网络编程(怎样实现两个客户端之间的通信)
  • 在java中,如何表达界于20和40之间?
  • 正想学linux 请问red hat版本之间的问题
  • iptables如何限制同一个网段之间的通信
  • 使用tcp协议发送数据, 如果获得系统底层将包发到客户端之间的耗时?
  • vware如何在两个操作系统之间传送文件
  • com和ejb之间通讯
  • 求助java中如何在unicode和GBK2312之间转换
  • JSP页面之间怎样传递参数?
  • jsp(java)里面怎么求两个日期之间的天数?
  • 如何在页面之间传递参数,请举例!
  • 怎样精确设置GridLayout布局中每个小格之间的间隙???
  • instance,object,reference之间有什么区别与联系,我都糊涂了。
  • applet和javabean之间可以通信吗?
  • 请教gnome和kde之间的转换问题!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3