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

时间: 2024-10-30 06:50:54

C与C++之间相互调用的相关文章

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

 这篇文章主要介绍了C与C++之间相互调用的实例方法,大家参考使用吧 1.导出C函数以用于C或C++的项目   如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言.如果是从C++语言模块使用,则用C链接声明这些函数.如果使用此技术并为DLL提供头文件,则这些函数可以原封不动地由C和C++模块使用.   以下代码演示可由 C 和 C++ 客户端应用程序使用的头文件:     代码如下: // MyCFuncs.h #i

Android Activity之间相互调用与传递参数的原理与用法分析_Android

本文实例讲述了Android Activity之间的相互调用与传递参数.分享给大家供大家参考,具体如下: Activity之间是如何调用的 在javaWeb程序中,jsp与jsp之间的调用是通过重定向完成的,而在Android中,Activity与Activity之间的切换是通过Intent来完成的. 所谓Intent,它是Android中非常重要的内置组件,他可以理解为"我要干一件什么事情".在Android中有3大组件:Activity,Service.Broadcast,他们之间

Android Activity之间相互调用与传递参数的原理与用法分析

本文实例讲述了Android Activity之间的相互调用与传递参数.分享给大家供大家参考,具体如下: Activity之间是如何调用的 在javaWeb程序中,jsp与jsp之间的调用是通过重定向完成的,而在Android中,Activity与Activity之间的切换是通过Intent来完成的. 所谓Intent,它是Android中非常重要的内置组件,他可以理解为"我要干一件什么事情".在Android中有3大组件:Activity,Service.Broadcast,他们之间

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

1.导出C函数以用于C或C++的项目 如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言.如果是从C++语言模块使用,则用C链接声明这些函数.如果使用此技术并为DLL提供头文件,则这些函数可以原封不动地由C和C++模块使用. 以下代码演示可由 C 和 C++ 客户端应用程序使用的头文件: 复制代码 代码如下: // MyCFuncs.h#ifdef __cplusplusextern "C" {  // o

不同的系统之间,相互调用,如何保证数据的一致性?

问题描述 有两个不同Javaweb(strut2+ibatis+spring)项目,相互之间调用,如何保证他们数据(事务)的一致行?如Project1(P1)中有method1(m1)方法,Project2(P2)中有method2(m2)方法,如果m1中调用m2,如果m2出现异常,m2回滚,同时m1也回滚:如果调用m2后,m1出现异常,m1回滚,同时m2也回滚到调用前的状态,请问这个改如何实现? 解决方案 解决方案二:JTA.spring里可以用.网上搜吧.解决方案三:看错了.不好意思解决方案

Javascript框架(iframe)之间相互传值程序代码

很多框架存在父子关系,操作起来十分麻烦,很多同学经常出现这样悲催的代码:  代码如下 复制代码 window.parent.document.getElementById("main") .contentWindow.document.getElementById('input').value = document.getElementById('myIframe') .contentWindow.document.getElementById('s0').value; 看一个我自己做

Android编程使用WebView实现与Javascript交互的方法【相互调用参数、传值】

本文实例讲述了Android编程使用WebView实现与Javascript交互的方法.分享给大家供大家参考,具体如下: Android中可以使用WebView加载网页,同时Android端的Java代码可以与网页上的JavaScript代码之间相互调用. 效果图: (一)Android部分: 布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&qu

格式-关于Android项目中不同包之间的类相互调用

问题描述 关于Android项目中不同包之间的类相互调用 在同一个项目中我创建了几个包,然后在包 com.g.zxing.client.android中创建了类文件数据库MySQLiteOpenHelper我想在包com.g.zxing.client.android.result中的TextResultHandler.java调用MySQLiteOpenHelper格式如下import com.g.zxing.client.android.MySQLiteOpenHelper; public M

python学习-Python类之间怎么相互调用?

问题描述 Python类之间怎么相互调用? 如果有两个类,第一个类想调用第一个类的函数或类里的对象该怎么办.python新手-- 解决方案 #import导入对应的模块,然后你就可以实例化类的对象,然后调用成员方法了 解决方案二: python类之间是怎么相互调用的两个.py之间类的相互调用问题 解决方案三: 来源: http://blog.csdn.net/liunian17/article/details/7318809?? 要调用一个类中的成员变量或函数,首先要创建一个它的对象或对象指针