返回顶部
首页 > 资讯 > 后端开发 > GO >如何跨操作系统一致地将 C uint64_t 转换为 Cgo?
  • 667
分享到

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

2024-04-04 23:04:52 667人浏览 薄情痞子
摘要

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

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

问题内容

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

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

#include <stdlib.h>

typedef struct {
   k uint64_t;
} params;

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

package test


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?》文章吧,也可关注编程网公众号了解相关技术文章。

您可能感兴趣的文档:

--结束END--

本文标题: 如何跨操作系统一致地将 C uint64_t 转换为 Cgo?

本文链接: https://lsjlt.com/news/596172.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作