CGO学习

CGO练习


在 Go 语言中调用 C++ 代码: link.

package main
/*
#include <stdio.h>
#include <errno.h>
#cgo windows CFLAGS: -DCGO_OS_WINDOWS=1
#cgo darwin CFLAGS: -DCGO_OS_DARWIN=1
#cgo linux CFLAGS: -DCGO_OS_LINUX=1

#if defined(CGO_OS_WINDOWS)
    const char* os = "windows";
#elif defined(CGO_OS_DARWIN)
    const char* os = "darwin";
#elif defined(CGO_OS_LINUX)
    const char* os = "linux";
#else
#    error(unknown os)
#endif

void SayHello(const char* s);

static void SayHello0(const char* s) {
    puts(s);
}

static int div(int a, int b) {
    if(b == 0) {
        errno = EINVAL;
        return 0;
    }
    return a/b;
}

void printint(int v) {
    printf("printint: %d\n", v);
}

struct A {
    int i;
    float f;
    int type; // type 是 Go 语言的关键字
};
 */
import "C"
import "fmt"

func main(){
   println("hello cgo")
   C.puts(C.CString("Hello, World\n"))   // C.CString函数将Go语言字符串转为C语言字符串,最后调用CGO包的C.puts函数向标准输出窗口打印转换后的C字符串
   _, err := C.SayHello0(C.CString("Hello, ys\n")) // 使用自定义的函数,
   fmt.Println(err) //cgo对errno做了特殊处理,可以通过第二个返回值来获取C语言的错误状态。对于void类型函数,这个特性依然有效
   C.SayHello(C.CString("Hello, wzz\n")) // 外部

   v := 42
   C.printint(C.int(v)) //C.int(v)用于将一个Go中的int类型值强制类型转换转化为C语言中的int类型值,然后调用C语言定义的printint函数进行打印

   print(C.GoString(C.os),"\n")
   C.puts(C.os)

   var a C.struct_A
   fmt.Println(a.i)
   fmt.Println(a.f)
   fmt.Println(a._type) // _type 对应 type,如果结构体的成员名字中碰巧是Go语言的关键字,可以通过在成员名开头添加下划线来访问

   // CGO也针对<errno.h>标准库的errno宏做的特殊支持:在CGO调用C函数时如果有两个返回值,那么第二个返回值将对应errno错误状态。
   v0, err0 := C.div(2, 1)
   fmt.Println(v0, err0)

   v1, err1 := C.div(1, 0)
   fmt.Println(v1, err1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值