有时C程序里需要用到C++的类,但是C语言又不能直接调用类,这时需要把C++的类使用C接口封装后,再调用,

可以将封装后的C++代码编译成库文件,供C语言调用;

需要注意的是,封装的C++代码库文件是用g++编译的,所以在C中调用时,需要添加extern "C"{}关键字。

编译c代码时,要加上-lstdc++

如下代码,是c代码使用C++的map容器的例子:

  1. //test.cpp 封装C++代码
  2. #include <map>
  3. #include <iostream>
  4. #include "test.h"
  5. using namespace std;
  6. static map<int, int> m_testMap;
  7. void pushVal(int key, int val)
  8. {
  9. m_testMap[key] = val;
  10. }
  11. int getVal(int key)
  12. {
  13. map<int, int>::iterator iter = m_testMap.find(key);
  14. if (iter != m_testMap.end() )
  15. {
  16. return iter->second;
  17. }
  18. return -1;
  19. }
  20. //头文件 test.h
  21. #ifndef _TEST_H_
  22. #define _TEST_H_
  23. #ifdef __cplusplus
  24. extern "C" {
  25. #endif
  26. void pushVal(int key, int val);
  27. int getVal(int key );
  28. #ifdef __cplusplus
  29. }
  30. #endif
  31. #endif

main函数,调用封装的C++接口:

  1. //main.c
  2. #include <stdio.h>
  3. #include "test.h"
  4. int main()
  5. {
  6. printf("test\n");
  7. for (int i = 0; i < 10; i++)
  8. {
  9. printf("push key: %d, val: %d\n", i, i*10);
  10. pushVal(i, i*10);
  11. }
  12. int val = 0;
  13. for (int i = 0; i < 10; i++)
  14. {
  15. val = getVal(i);
  16. printf("get key: %d, val: %d\n", i,val);
  17. }
  18. return 0;
  19. }

编译的时候,为了简单,我这里没有编译成库文件,直接用引用.o编译的:

makefile:

  1. all:
  2. g++ -Wall -c test.cpp -o test.o
  3. gcc -Wall -c main.c -o main.o
  4. gcc -Wall test.o main.o -o test -lstdc++
  5. clean:
  6. rm test *.o

编译运行结果如下:

  1. make
  2. g++ -Wall -c test.cpp -o test.o
  3. gcc -Wall -c main.c -o main.o
  4. gcc -Wall test.o main.o -o test -lstdc++
  5. 运行:
  6. ./test
  7. test
  8. push key: 0, val: 0
  9. push key: 1, val: 10
  10. push key: 2, val: 20
  11. push key: 3, val: 30
  12. push key: 4, val: 40
  13. push key: 5, val: 50
  14. push key: 6, val: 60
  15. push key: 7, val: 70
  16. push key: 8, val: 80
  17. push key: 9, val: 90
  18. get key: 0, val: 0
  19. get key: 1, val: 10
  20. get key: 2, val: 20
  21. get key: 3, val: 30
  22. get key: 4, val: 40
  23. get key: 5, val: 50
  24. get key: 6, val: 60
  25. get key: 7, val: 70
  26. get key: 8, val: 80
  27. get key: 9, val: 90

个人微信服务号同步推送文章(微信公众号:fensnote):

C调用C++代码的更多相关文章

  1. 如何实现 javascript “同步”调用 app 代码

    在 App 混合开发中,app 层向 js 层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论).为了保证 web 流畅,大部分时候,我们应该使用异步接口,但是某些 ...

  2. 1.JAVA中使用JNI调用C++代码学习笔记

    Java 之JNI编程1.什么是JNI? JNI:(Java Natibe Inetrface)缩写. 2.为什么要学习JNI?  Java 是跨平台的语言,但是在有些时候仍然是有需要调用本地代码 ( ...

  3. 股票数据调用示例代码php

    <!--?php // +---------------------------------------------------------------------- // | JuhePHP ...

  4. 在HTML标签<a/>中调用javascript代码

    <a/>标签的“href”属性可以是一个有效的URL,表示跳转的目的地,除此之外,href还可以是一段javascript代码.当为“href”设置javascript代码时,格式如下:& ...

  5. 在Java中直接调用js代码(转载)

    http://blog.csdn.net/xzyxuanyuan/article/details/8062887 JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Ja ...

  6. java调用python代码

    同样的我们需要安装jython,具体的步骤如下: 1. 去 http://sourceforge.net/projects/jython/ 下载最新的jython相关的jar包. 2. 下载下来的ja ...

  7. Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示

    如下为本人亲证代码: 一: 编译器的安装与配置(环境不同,显示结果不同) 要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSI C/C++编译器: 5.0.6.0 ...

  8. 在Java中直接调用js代码

    JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert ...

  9. C#调用Java代码

    c#直接调用java代码,需要ikvmbin-0.44.0.5.zip.下载地址: http://pan.baidu.com/share/link?shareid=3996679697&uk= ...

  10. [转]Asp.Net调用前台js调用后台代码分享

    1.C#前台js调用后台代码 前台js <script type="text/javascript" language="javascript"> ...

随机推荐

  1. SQL批量插入数据【万级】

    1.每4000条插入一次 for (int i = 0; i < dt.Rows.Count; i++) { IsTBProductForStockInfo model = new IsTBPr ...

  2. JVM 专题二十一:垃圾回收(五)垃圾回收器 (二)

    3. 回收器 3.1 Serial回收器:串行回收 3.1.1 概述 Serial收集器是最基本.历史最悠久的垃圾收集器了.JDK1.3之前回收新生代唯一的选择. Serial收集器作为Hotspot ...

  3. python--动态网页渲染pyqt5

    原文:https://blog.csdn.net/tymatlab/article/details/78647543 PyQt5 渲染动态网页 示例代码: # -*- coding: UTF-8 -* ...

  4. flask源码剖析系列(系列目录)

    flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...

  5. mysql数据的增删改-内含经典面试题

    #DML语言 /* 数据操作语言: 插入:insert 修改:update 删除:delete */ #一.插入语句 #方式一:经典的插入 /* 语法: insert into 表名(列名,...) ...

  6. HangFire多集群切换及DashBoard登录验证

    项目中是有多个集群的,现在存在一个是:在切换web集群时,如何切换HangFire的周期性任务. 先采取的解决办法是: 每个集群分一个队列,在周期性任务入队时分配当前web集群的集群id单做队列名称. ...

  7. 开源|如何开发一个高性能的redis cluster proxy?

    文|曹佳俊 网易智慧企业资深服务端开发工程师 背    景 redis cluster简介 Redis cluster是redis官方提供集群方案,设计上采用非中心化的架构,节点之间通过gossip协 ...

  8. static关键字有何魔法?竟让Spring Boot搞出那么多静态内部类

    生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...

  9. Ethical Hacking - POST EXPLOITATION(3)

    Spying - Capturing Key Strikes & Taking Screen Shots Log all mouse/keyboard events > keyscan- ...

  10. 解决win10安装flask-mysqldb报错 Python2.7

    win10上安装的pycharm,在pycharm创建的py2.7虚拟环境中安装flask-sqlalchemy 执行pip install flask-mysqldb报错 error: Micros ...