博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不用 SWIG,Go 使用 C++ 代码的方式
阅读量:5889 次
发布时间:2019-06-19

本文共 1575 字,大约阅读时间需要 5 分钟。

hot3.png

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

这是一个C++头文件:

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

这是对应的源文件:

#include 
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 
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::X11X::~X

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

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

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

你可能感兴趣的文章
ABP理论学习之仓储
查看>>
我的友情链接
查看>>
CentOS图形界面和命令行切换
查看>>
HTML5通信机制与html5地理信息定位(gps)
查看>>
加快ALTER TABLE 操作速度
查看>>
PHP 程序员的技术成长规划
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
js replace,正则截取字符串内容
查看>>
作业2
查看>>
nginx的信号量
查看>>
云im php,网易云IM
查看>>
DEFERRED_SEGMENT_CREATION
查看>>
Ada boost学习
查看>>
开源 java CMS - FreeCMS2.3字典管理
查看>>
block,inline和inline-block概念和区别
查看>>
移动端常见随屏幕滑动顶部固定导航栏背景色透明度变化简单jquery特效
查看>>
javascript继承方式详解
查看>>
lnmp环境安装sh脚本
查看>>
白话讲反射技术 --- 适合初学者入门引导
查看>>
css变形 transform
查看>>