不用SWIG,Go使用C++代码的方式
将C++代码用C作一次封装,就可以让Go调用了。
这是一个C++头文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#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 |
这是对应的源文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#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等)的存在,定义一个结构体:
|
1
2
3
4
|
typedef struct _X_t{ int unused;}X_t; |
这个结构体来充当class X的作用。
完整的C头文件如下:(这个头文件中没有任何C++特有的东西!)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#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)如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#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文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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)} |
结果如下:
|
1
2
3
|
X::X11X::~X |
这就实现了Go使用C++代码。
如果想在Go中使用大型C++开源库,这个方法有些麻烦(而且C++的编译比较慢),但不失为一种选择。
http://my.oschina.net/jthmath/blog/614298
不用SWIG,Go使用C++代码的方式的更多相关文章
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】
原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...
- 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式
32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...
- 不用浏览器,直接用代码发送文件给webservices所在服务器 并且可以周期行的发送
package com.toic.test; import java.io.DataInputStream; import java.io.DataOutputStream; import java. ...
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!
原文地址 迁移到:http://www.bdata-cap.com/newsinfo/1741515.html 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和f ...
- 通过代码的方式完成WCF服务的寄宿工作
使用纯代码的方式进行服务寄宿 服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境.通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用, ...
- 编写css代码的方式
css(层叠样式表) 在一个网页中主要负责了页面的数据样式. 编写css代码的方式: 第一种: 在style标签中编写css代码. 只能用于本页面中,复用性不强 ...
- WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境.通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以 ...
- Java 10 的 10 个新特性,将彻底改变你写代码的方式!
Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...
- 21_Android中常见对话框,光传感器,通过重力感应器编写出指南针应用,帧动画,通过Jav代码的方式编写补间动画,通过XML的方式编写补间动画
1 关于常见的对话框,主要有: 常见的对话框,单选对话框,多选对话框,进度条对话框(转圈类型的),带进度条的对话框. 案例结构: 完成如下结构的案例,将所有的案例都测试一下: 2 编写MainA ...
- 如何用代码的方式取出SAP C4C销售订单创建后所有业务伙伴的数据
比如我创建了一个Sales Order(销售订单)后,如何用代码的方式取出这些通过SAP Partner determination自动填充的Involved Parties信息呢? 一种方法可以使用 ...
随机推荐
- 我的ubuntu
题外话:不知不觉也已经大三,最近思考了很多.在腾讯网看到了对李嘉诚的一篇专访,感触颇深. 想起来我从第一次接触ubuntu到现在也有一年了,记得第一个版本还是12.04,不过很快就换成了12.10,在 ...
- Iframe知识点
var oIframe=document.getElementById('iframe1'); 获取iframe对象: oIframe.contentWindow.// iframe 里的win ...
- Zookper
http://blog.csdn.net/yangbutao/article/details/11669609 http://www.oschina.net/code/snippet_255033_2 ...
- repeater一个简单的用法例子
(前台) <asp:Repeater ID="Repeater1" runat="server" onitemdatabound=" ...
- 如何配置和使用Tomcat访问日志
配置位置在log下的server.xml,(tomcat容器) <Engine defaultHost="localhost" name="Catalina&quo ...
- 羊和汽车问题(或s三门问题(Monty Hall problem)亦称为蒙提霍尔问题)
三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal.问题名字来自该节目的主持人蒙提·霍尔(Mon ...
- HtmlAgilityPack 抓取页面的乱码处理
HtmlAgilityPack 抓取页面的乱码处理 用来解析 HTML 确实方便.不过直接读取网页时会出现乱码. 实际上,它是能正确读到有关字符集的信息,怎么会在输出时,没有取到正确内容. 因此,读两 ...
- English learning method ---学英语重中之重打通“任督二脉”
漫漫十年艰辛路,英语学习之旅 曾经秉承“路漫漫其修远兮,吾将上下而求索”的信念,初一那年了解到原来(a b c d e f g) 不仅仅读作(啊,波,词,的,额,佛,哥),在英语的世界中它有另外的读法 ...
- Swift入门Hello World! Swift.
苹果公司推出新的开发语言Swift,随着关于趋势,外观和OC什么是不一样的地方. 前提条件:已安装Xcode6-Beta(这个过程是不表) 1.打开Xcode6-Beta,第二选择Create a n ...
- IOS7 适配以及向下兼容问题
1.所有的UIViewController加如下方法. - (void) viewDidLayoutSubviews { if ([[[UIDevice currentDevi ...