C调用C++

C调用C++链接库:

  1.编写C++代码,编写函数的时候,需要加入对C的接口,也就是extern “c"

  2.由于C不能直接用"class.function”的形式调用函数,所以C++中需要为C写一个接口函数。例如本来要调用student类的talk函数,就另外写一个cfun(),专门建一个student类,并调用talk函数。而cfun()要有extern声明

  3.我在练习中就使用在C++头文件中加extern ”c”的方法。而C文件要只需要加入对cpp.h的引用

  4.详细见如下代码:

    student是一个类,里边有talk函数,就输出一句话而已

    cpp.cpp与cpp.h是两个C++代码,包含对C的接口

    最后用C代码:helloC.c来测试结果

student.cpp

[cpp] view
plain
copyprint?

  1. #include <iostream>  
  2. using namespace std;  
  3. #include "student.h"  
  4. void student::talk(){  
  5.  cout<<"I am Kenko"<<endl;  
  6. }  

 student.h:

[cpp] view
plain
copyprint?

  1. #ifndef _STUDENT_  
  2. #define _STUDENT_  
  3.   
  4. class student{  
  5.  public:  
  6.    void talk();  
  7. };  
  8.   
  9. #endif  

cpp.h:

[cpp] view
plain
copyprint?

  1. #ifndef _CPP_  
  2. #define _CPP_  
  3.   
  4. #include "student.h"  
  5. #ifdef __cplusplus  
  6. extern "C" {  
  7. #endif  
  8. void helloCplusplus();  
  9. #ifdef __cplusplus  
  10. }  
  11. #endif  
  12.   
  13. #endif  

cpp.cpp:

[cpp] view
plain
copyprint?

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. #include "cpp.h"  
  5. student stu;  
  6. void helloCplusplus(){  
  7. cout<<"helloC++"<<endl;  
  8. stu.talk();  
  9. }  
  10.   
  11. void helloCplusplus2(){  
  12. cout<<"helloC++"<<endl;  
  13. }  

helloC.c:

[cpp] view
plain
copyprint?

  1. #include <stdio.h>  
  2. #include "cpp.h"  
  3.   
  4. int main(){  
  5.     helloCplusplus();  
  6.      return 0;  
  7. }  

 我这次练习是直接在xp环境下,在CMD命令行方式用gcc,g++来编译的。

1.编译C++代码,成为链接库

  g++ -shared -o libccall.so cpp.cpp student.cpp  (libccall.so为库名)

2.编译C代码:g++ helloC.c ./libccall.so。这里一定要用g++,如果用gcc会出错,因为gcc编译C++文件才会自动调用g++,但如果对象直接就是C文件就不会调用g++了。

来源:http://blog.csdn.net/w397090770/article/details/7744454

时间: 2024-09-01 15:33:49

C调用C++的相关文章

Windows 8应用开发之异步调用

 不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使得比较复杂的逻辑操作由异步进行,用户仍然可以继续使用应用,不会有无响应的等待情况出现. 本篇将通过一个简单的实例演示如何在Windows 8 应用中使用异步编程.首先我们来编写一个"Get Blogs"按钮,点击它可以从Windows Blog中获取博客列表.当然获取博客信息的过程是由异步进行的,这个过程中为了测试用户仍然可以与应用交互,我们再

C++ Builder调用Matlab

Borland C++Builder是一种新颖的可视化编程语言.在工程应用中,我们一般用C++Builder语言编写应用程序,实现交互界面.数据采集和端口操作等,但C++Builder在数值处理分析和算法工具等方面,其效率远远低于Matlab语言.在准确方便地绘制数据图形方面,Matlab语言更具有无可比拟的优势.此外,Matlab还提供功能强大的工具箱.但Matlab的缺点是不能实现端口操作和实时控制.因此,若能将两者结合运用,实现优势互补,将获得极大的效益. 本文结合实际介绍了应用Borla

javaweb-网页调用ocx控件打开或创建注册表的权限问题

问题描述 网页调用ocx控件打开或创建注册表的权限问题 在某几个win7 64位笔记本上, 通过服务器页面调用ocx读取注册表会提示无权限的现象,但使用本地html文件调用没问题, 不知是何原因,求大侠给点提示 解决方案 又试了一下,使用世界之窗浏览器可以正常使用了.但不明白为何? 解决方案二: ie本地file协议浏览(intranet)和http访问(internet)使用的是不同的安全设置,你按照本地的intranet安全配置internet安全设置 不过你这种需求没什么意义,只能针对特殊

请问下有谁调用过银联代付的接口

问题描述 请问下有谁调用过银联代付的接口 有前辈在吗,我可以贴代码,访问接口,返回值表示参数错误,我可以贴代码 解决方案 如果用java的话,可以参考以下链接的几个文件看看 http://www.chendw.cn/original/205.html 解决方案二: 贴出来吧哥们. 我也想知道

控制-flex4 fader.play()开始后调用fader.stop()出现的问题

问题描述 flex4 fader.play()开始后调用fader.stop()出现的问题 初始界面是这样 开始闪动在控制停止就变成白色的了把原有的背景颜色给覆盖了,请各位大神指导解决这个问题.我想要的效果是在停止时还可以改变闪动对象的背景颜色.覆盖图: 闪动图是这样:

新人一枚,请问怎样从B线程调用A线程的内容?

问题描述 新人一枚,请问怎样从B线程调用A线程的内容? 具体要求:写一个线程A,得到0-10的随机数,再写一个线程B来了调用线程A!!!!! 解决方案 int a;//全局变量,如果多个线程同步访问需要加锁 A...//线程A B...//线程B 代码结构大致如上,访问的时候,因为变量a是全局数据,所以在线程A和B中都可以直接访问,就好像C中的任何函数都可以访问和使用全局变量一样 解决方案二: 放是全局变量来交换数据

java se-使用泛型打印输出任意类型的数组,为什么调用时有错误?

问题描述 使用泛型打印输出任意类型的数组,为什么调用时有错误? import java.util.Arrays; public class FanXing { public static void printMatrix(T[][] matrix){ for(int i=0;i<matrix.length;i++){ System.out.println(Arrays.toString(matrix[i])); } } public static void main(String[] args)

Android Jni调用so库,加载库失败分析

现有一个项目,通过JNI接口调用底层库,例如:lib***.so 如下所示,总是加载不成功.调试发现,每次加载so库,会跳到catch异常处理部分,然后打印异常log信息. static{ try{ System.load("/data/data/com.***/lib/lib***.so"); } catch(UnsatisfiedLinkError ulink){ Log.i("HVnative====","Can not load library&q

PHP调用三种数据库的方法(3)

数据|数据库 Oracle(甲骨文)是世界上最为流行的关系数据库.它是大公司推崇的工业化的强有力的引擎.我们先看看其相关的函数: (1)integer ora_logon(string user , string password) 开始对一个Oracle数据库服务器的连接. (2)integer ora_open(integer connection) 打开给出的连接的游标. (3)integer ora_do(integer connection, string query) 在给出的连接上

线程-java调用sqlplus下载数据库文件到本地后,如果用java关闭此进程,大神戳进来

问题描述 java调用sqlplus下载数据库文件到本地后,如果用java关闭此进程,大神戳进来 1.用java调用sqlplus,将指定的存储过程下载到本地作为文本文件2.在java读取此本地文件做处理,处理后写1个新的文本文件在本地我将上面2个步骤用2个进程thread1,thread2因为步骤2必须等步骤1结束才能执行,所以我调用thread1.start()thread1.join()以及thread2.start().但是运行结果是每次都只执行出了步骤1,步骤2执行不出来.考虑是否在步