不用 SWIG,Go 使用 C++ 代码的方式
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++ 代码的方式相关推荐
- 如何用代码的方式取出SAP C4C销售订单创建后所有业务伙伴的数据
比如我创建了一个Sales Order(销售订单)后,如何用代码的方式取出这些通过SAP Partner determination自动填充的Involved Parties信息呢? 一种方法可以使用 ...
- 21_Android中常见对话框,光传感器,通过重力感应器编写出指南针应用,帧动画,通过Jav代码的方式编写补间动画,通过XML的方式编写补间动画
1 关于常见的对话框,主要有: 常见的对话框,单选对话框,多选对话框,进度条对话框(转圈类型的),带进度条的对话框. 案例结构: 完成如下结构的案例,将所有的案例都测试一下: 2 编写MainA ...
- java 8代码 改 java7_Java 8 到 Java 14,改变了哪些你写代码的方式?
前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...
- Java 10的10个新特性,将彻底改变你写代码的方式
转载自 Java 10的10个新特性,将彻底改变你写代码的方式 Java 9才发布几个月,很多玩意都没整明白,现在Java 10又要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,J ...
- 这两年多我写PHP业务代码的方式是如何进化的
曾今 谁都有过迷茫期,下面是我开始PHP开发中,不断改变的代码组织方式. 初期:所有代码一股脑控制器controller 曾今只是简单的理解MVC 中期:业务代码抽象一部分到模型层model 开始觉得 ...
- Java 8 到 Java 14,改变了哪些你写代码的方式?
前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...
- java update 8_版本任你发,我用Java 8!JDK的更新,改变了哪些你写代码的方式?...
前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...
- python代码编辑教程_python教程:pycharm编写代码的方式教学
python可以说是新的编程语言,虽说是新编程,但一出来,就受到很长程序员的关注,而且刚出现和java进行对比,很多人就拿python和java进行比较,想python到底好不好,他和java有什么区 ...
- 想敲代码又怕女朋友找?那就让她去玩桌面图标贪吃蛇,再也不用担心打扰自己敲代码了
想敲代码又怕女朋友找?那就让她去玩桌面图标贪吃蛇,再也不用担心打扰自己敲代码了 最近在逛博客的时候看见了一个有趣的项目,使用桌面图标进行贪吃蛇游戏.采用的代码是vb,但我实在不会vb,就找了C++中关 ...
- 丰田代码函数一万行_丰田如何改变我们处理代码的方式
丰田代码函数一万行 by Adam Petrie 通过亚当·彼得里 丰田如何改变我们处理代码的方式 (How Toyota changed the way we approach code) As d ...
最新文章
- Ajax、Comet与Websocket
- 2020 年 4 月全国程序员工资新鲜出炉,我拖后腿了!
- python多进程参考代码
- 走近Quick Audience,了解消费者运营产品的发展和演变
- python爬视频网站数据_python爬虫基础应用----爬取无反爬视频网站
- SQL 存储过程 多条件 分页查询 性能优化
- 高逼格!程序猿的表白也可以这么浪漫
- oracle系统FA调整折旧年限,Oracle财务管理系统培训手册.doc
- orl_faces数据集分享
- win7系统修复工具_win7系统如何修复
- vi编辑器的使用 快捷键
- 中国移动彩信业务割接
- oracle发生20001,ORA-20001错误一例
- Fabric 1.0 ubuntu1704安装过程
- Python有趣的小案例-美国队长盾牌
- 英文文章:中国国家医疗联合体的演化路径和内部交互机制研究:基于复杂系统理论的分析
- 什么是软件开发领域的 obsolete 或者 deprecated 含义
- element-icon 图标大全
- 大数据之电商分析系统(一)
- 瑞星的彻底批判,一只老甲鱼的末路狂奔
热门文章
- 解析C#中is和as操作符的用法
- 定时关机 v1.0(autoshut v1.0)
- elasticsearch索引的初始化操作以及marvel操作(增删改查),批量查询_mget,批量操作_bulk
- JAVA通过HTTPS发送POST请求的方法
- 测试人员提高业务掌握度的方案
- 06-01 搭建持续集成平台 Jenkins
- java html 区别是什么意思_Java html 区别是什么
- 技巧 | 如何使用R语言的常用工具包绘制双变量填充地图
- linux en_us支持什么格式的中文,更改Linux操作系统下的显示默认支持语言
- java 编码解码_深入解析Java中的编码转换以及编码和解码操作