登录
首页 >  Golang >  Go问答

如何跨操作系统一致地将 C uint64_t 转换为 Cgo?

来源:stackoverflow

时间:2024-03-31 08:15:33 292浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《如何跨操作系统一致地将 C uint64_t 转换为 Cgo?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我正在使用 go 的一些 c 库,使用 cgo 来处理转换。

我有一个 c 头文件,如下所示:

#include 

typedef struct {
   k uint64_t;
} params;

此结构在 go 中使用,代码如下:

package test

/*
#cgo cflags: -g -wall
#cgo ldflags: -l. -lmylib -lm -ldl
#include "mylib.h"
*/
import "c"
func newparams(k uint64) paramets {
  return params{
    k:     c.ulonglong(k),
  }
}

该代码在使用 apple clang 版本 12.0.0 的 os x 上编译良好,但在使用 clang 版本 7.1.0 的 linux 上编译失败,产生以下错误:

cannot use _Ctype_ulonglong(k) (type _Ctype_ulonglong) as type _Ctype_ulong in field value

如果我将对 c.ulonglong 的调用更改为 c.ulong,它在 linux 上工作正常,但在 os x 上失败。

如何确保相同的代码在两个平台上都能运行?


正确答案


使用 go build -work 我能够确认问题源于映射差异:

  • 在 Linux 端,C unit64_t 被映射到 C.ulong
  • 在 Mac 端,它会映射到 C.ulonglong

请注意,C.ulongC.ulonglong 都映射到 go uint64,但直接使用 Go 类型并删除 C.xxx(k) 转换会失败。

解决方案是使用 C.uint64_t(k) ,这使得我们正在讨论的类型的大小变得明确。这很好,因为 C 类型无论如何都是 uin64_t

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何跨操作系统一致地将 C uint64_t 转换为 Cgo?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>