2019独角兽企业重金招聘Python工程师标准>>>

将C++代码用C作一次封装,就可以让Go调用了。

这是一个C++头文件:

#ifndef CGO_CPPGO_CLASS_H_
#define CGO_CPPGO_CLASS_H_#include <stdint.h>class X
{
public:X(int32_t a);~X();void Plus();int32_t Func(int32_t b);
private:int32_t m_;
};#endif

这是对应的源文件:

#include <iostream>
using std::cout;
using std::endl;#include "class.h"X::X(int32_t a):m_{ a }
{cout << "X::X" << endl;
}X::~X()
{cout << "X::~X" << endl;
}void X::Plus()
{m_ += 1;
}int32_t X::Func(int32_t b)
{return m_ + b;
}

为了让Go感知不到C++(class、std::cout等)的存在,定义一个结构体:

typedef struct _X_t
{int unused;
}X_t;

这个结构体来充当class X的作用。

完整的C头文件如下:(这个头文件中没有任何C++特有的东西!)

#ifndef C_WRAPPER_H_
#define C_WRAPPER_H_#include <stdint.h>typedef struct _X_t
{int unused;
}X_t;#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endifEXTERN_C X_t *NewX(int32_t a); // 充当构造函数
EXTERN_C void Delete(X_t *px); // 充当析构函数
EXTERN_C void Plus(X_t *px);
EXTERN_C int32_t Func(X_t *px, int32_t b);#endif

源文件(.cpp)如下:

#include "c-wrapper.h"
#include "class.h"X_t *NewX(int32_t a)
{X *px = new X{ a };return (X_t*)px;
}void Delete(X_t *px)
{X *p = (X*)px;delete p;
}void Plus(X_t *px)
{((X*)px)->Plus();
}int32_t Func(X_t *px, int32_t b)
{return ((X*)px)->Func(b);
}

接下来,就可以在Go中包含c-wrapper.h文件:

package mainimport ("fmt"
)/*
#cgo CPPFLAGS: -std=c++11
#include "c-wrapper.h"
*/
import "C"func main() {px := C.NewX(3)C.Plus(px)var n int32 = int32(C.Func(px, 7))fmt.Println(n)C.Delete(px)
}

结果如下:

X::X
11
X::~X

这就实现了Go使用C++代码。

如果想在Go中使用大型C++开源库,这个方法有些麻烦(而且C++的编译比较慢),但不失为一种选择。

转载于:https://my.oschina.net/jthmath/blog/614298

不用 SWIG,Go 使用 C++ 代码的方式相关推荐

  1. 如何用代码的方式取出SAP C4C销售订单创建后所有业务伙伴的数据

    比如我创建了一个Sales Order(销售订单)后,如何用代码的方式取出这些通过SAP Partner determination自动填充的Involved Parties信息呢? 一种方法可以使用 ...

  2. 21_Android中常见对话框,光传感器,通过重力感应器编写出指南针应用,帧动画,通过Jav代码的方式编写补间动画,通过XML的方式编写补间动画

     1 关于常见的对话框,主要有: 常见的对话框,单选对话框,多选对话框,进度条对话框(转圈类型的),带进度条的对话框. 案例结构: 完成如下结构的案例,将所有的案例都测试一下: 2 编写MainA ...

  3. java 8代码 改 java7_Java 8 到 Java 14,改变了哪些你写代码的方式?

    前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...

  4. Java 10的10个新特性,将彻底改变你写代码的方式

    转载自 Java 10的10个新特性,将彻底改变你写代码的方式 Java 9才发布几个月,很多玩意都没整明白,现在Java 10又要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,J ...

  5. 这两年多我写PHP业务代码的方式是如何进化的

    曾今 谁都有过迷茫期,下面是我开始PHP开发中,不断改变的代码组织方式. 初期:所有代码一股脑控制器controller 曾今只是简单的理解MVC 中期:业务代码抽象一部分到模型层model 开始觉得 ...

  6. Java 8 到 Java 14,改变了哪些你写代码的方式?

    前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...

  7. java update 8_版本任你发,我用Java 8!JDK的更新,改变了哪些你写代码的方式?...

    前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...

  8. python代码编辑教程_python教程:pycharm编写代码的方式教学

    python可以说是新的编程语言,虽说是新编程,但一出来,就受到很长程序员的关注,而且刚出现和java进行对比,很多人就拿python和java进行比较,想python到底好不好,他和java有什么区 ...

  9. 想敲代码又怕女朋友找?那就让她去玩桌面图标贪吃蛇,再也不用担心打扰自己敲代码了

    想敲代码又怕女朋友找?那就让她去玩桌面图标贪吃蛇,再也不用担心打扰自己敲代码了 最近在逛博客的时候看见了一个有趣的项目,使用桌面图标进行贪吃蛇游戏.采用的代码是vb,但我实在不会vb,就找了C++中关 ...

  10. 丰田代码函数一万行_丰田如何改变我们处理代码的方式

    丰田代码函数一万行 by Adam Petrie 通过亚当·彼得里 丰田如何改变我们处理代码的方式 (How Toyota changed the way we approach code) As d ...

最新文章

  1. Ajax、Comet与Websocket
  2. 2020 年 4 月全国程序员工资新鲜出炉,我拖后腿了!
  3. python多进程参考代码
  4. 走近Quick Audience,了解消费者运营产品的发展和演变
  5. python爬视频网站数据_python爬虫基础应用----爬取无反爬视频网站
  6. SQL 存储过程 多条件 分页查询 性能优化
  7. 高逼格!程序猿的表白也可以这么浪漫
  8. oracle系统FA调整折旧年限,Oracle财务管理系统培训手册.doc
  9. orl_faces数据集分享
  10. win7系统修复工具_win7系统如何修复
  11. vi编辑器的使用   快捷键
  12. 中国移动彩信业务割接
  13. oracle发生20001,ORA-20001错误一例
  14. Fabric 1.0 ubuntu1704安装过程
  15. Python有趣的小案例-美国队长盾牌
  16. 英文文章:中国国家医疗联合体的演化路径和内部交互机制研究:基于复杂系统理论的分析
  17. 什么是软件开发领域的 obsolete 或者 deprecated 含义
  18. element-icon 图标大全
  19. 大数据之电商分析系统(一)
  20. 瑞星的彻底批判,一只老甲鱼的末路狂奔

热门文章

  1. 解析C#中is和as操作符的用法
  2. 定时关机 v1.0(autoshut v1.0)
  3. elasticsearch索引的初始化操作以及marvel操作(增删改查),批量查询_mget,批量操作_bulk
  4. JAVA通过HTTPS发送POST请求的方法
  5. 测试人员提高业务掌握度的方案
  6. 06-01 搭建持续集成平台 Jenkins
  7. java html 区别是什么意思_Java html 区别是什么
  8. 技巧 | 如何使用R语言的常用工具包绘制双变量填充地图
  9. linux en_us支持什么格式的中文,更改Linux操作系统下的显示默认支持语言
  10. java 编码解码_深入解析Java中的编码转换以及编码和解码操作