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

     2023-03-29     117

关键词:

【中文标题】如何跨操作系统一致地将 C uint64_t 转换为 Cgo?【英文标题】:How to convert C uint64_t to Cgo consistently across OS? 【发布时间】:2022-01-11 13:19:51 【问题描述】:

我正在使用一些 C 库形式的 Go,使用 cgo 来处理转换。

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

#include <stdlib.h>

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 上会失败。

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

【问题讨论】:

【参考方案1】:

使用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 反正。

【讨论】:

如何在 ARM 上的 uint64_t 和 poly64_t 之间进行转换?

】如何在ARM上的uint64_t和poly64_t之间进行转换?【英文标题】:Howtoconvertbetweenuint64_tandpoly64_tonARM?【发布时间】:2021-05-2812:20:07【问题描述】:我想执行两个uint64_t值的多项式乘法(其中最低有效位(w&amp;1得到的那个)是最低... 查看详情

c语言之如何输出uint32_t和uint64_t和16进制

1、输出uint32_tuint32_ta=888;printf("ais%ld",a);     2、输出uint64_tuint64_tb=888;printf("bis%lu",b);printf("bis%lld",b);     3、输出16进制intc=16;printf("cis0x%08x",c 查看详情

防止将 uint64_t 转换为 uint16_t

】防止将uint64_t转换为uint16_t【英文标题】:Preventconvertinguint64_ttouint16_t【发布时间】:2015-06-0120:53:56【问题描述】:为什么下面的代码在clang++中编译?是否有任何c++标志来防止这种情况发生-我希望编译器抛出错误,因为我将std:... 查看详情

arduino关于长整形数据转换成string类型(代码片段)

Arduino关于长整形数据转换成String类型今天在项目开发中就遇到一个问题,需要将一个长长整形数据转换成String类型的数据。uint8_t/uint16_t/uint32_t/uint64_t前面3个类型还好说,容易实现,遇到了uint64_t,转换就出了问题。String类数据... 查看详情

如何用 D 语言正确打印 uint64_t (dtrace)

】如何用D语言正确打印uint64_t(dtrace)【英文标题】:Howtoprintuint64_tproperlyinDlanguage(dtrace)【发布时间】:2015-07-1418:01:38【问题描述】:我正在尝试使用DTrace脚本来printf一些Solaris类型为uint64_t(例如timestamp)的内核级信息。如何在我... 查看详情

从uint32_t[16]数组到uint32_t变量序列的64位副本(代码片段)

...4个字节。我试图使用该最终变量的起始目标地址并将其转换为uint64_t*指针,但这不起作用。然而,uint32_t[16]数组的指针是顺序的。这是我最近尝试的一个例子。uint32_tx00,x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15;uint64_t*Bu64ptr=... 查看详情

无法将 eosio::name 转换为 uint64_t

】无法将eosio::name转换为uint64_t【英文标题】:notabletoconverteosio::nametouint64_t【发布时间】:2019-05-1701:05:48【问题描述】:我正在使用eos.cdtv1.3.2处理智能合约。我已经尝试尽可能地重构以跟上eos.cdt中所做的更改。这是合同:#include... 查看详情

如何在 uint64_t 中移动 >= 32 位?

】如何在uint64_t中移动>=32位?【英文标题】:Howtoshift>=32bitsinuint64_t?【发布时间】:2013-02-1304:48:58【问题描述】:以下代码触发gcc警告(gcc4.2.1):#include<boost/cstdint.hpp>boost::uint64_tx=1<<32;//warning:leftshiftcount>=widthoftyp... 查看详情

生成随机 uint64_t

...6:36【问题描述】:给定一个任意类型的randomnumberengineeE,如何在整个范围内生成一个随机的uint64_t?类似这样,needs_random()函数需要一个随机的uint64_t,而blah()函数是用现代的&lt;random&gt;样式编写的,它接受任何类型的随机 查看详情

uint8_t/uint16_t/uint32_t/uint64_t数据类型详解(代码片段)

uint8_t/uint16_t/uint32_t/uint64_t是什么数据类型?在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很... 查看详情

如何在 MongoDB 文档中存储 unsigned long long (uint64_t) 值?

】如何在MongoDB文档中存储unsignedlonglong(uint64_t)值?【英文标题】:Howtostoreunsignedlonglong(uint64_t)valuesinaMongoDBdocument?【发布时间】:2012-12-2117:21:49【问题描述】:我想在MongoDB文档中存储unsignedlonglong(uint64_t)类型的数字,我该怎么做... 查看详情

uint8类型的数据占几个字节

...2字节uint16_t;4字节uint32_t;8字节uint64_t;POSIX表示可移植操作系统接口(PortableOperatingSystemInterfaceofUNIX,缩写为POSIX),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一... 查看详情

uint8_t/uint16_t/uint32_t/uint64_t这些数据类型是什么?(代码片段)

uint8_t/uint16_t/uint32_t/uint64_t都是别名,c语言中有哪些数据类型?怎么样取别名在C语言中有6种基本数据类型:short、int、long、float、double、char1、数值类型1)整型:short、int、long2)浮点型:float、double2、... 查看详情

uint8_t/uint16_t/uint32_t/uint64_t这些数据类型是什么?(代码片段)

uint8_t/uint16_t/uint32_t/uint64_t都是别名,c语言中有哪些数据类型?怎么样取别名在C语言中有6种基本数据类型:short、int、long、float、double、char1、数值类型1)整型:short、int、long2)浮点型:float、double2、... 查看详情

如何将字节数组转换为 boost::multiprecision::uint128_t?

】如何将字节数组转换为boost::multiprecision::uint128_t?【英文标题】:HowdoIconvertanarrayofbytestoaboost::multiprecision::uint128_t?【发布时间】:2018-10-2321:42:52【问题描述】:如果我有:charbuffer[16];如何将其原始字节转换为:boost::multiprecision:... 查看详情

c++uint32如何转constchar

uint32s=999;sLog.outError(s);//支行只卷接收char错误提示不能将参数999从“uint32”转换为"constchar"sLog.outError()要求一个字符串为参数,你把uint32直接放进去当然不行了。如果你一定要这样做,可以自己先把s转为:charbuf[20];sprintf(b... 查看详情

为啥 uint32_t 与 uint64_t 速度不同?

】为啥uint32_t与uint64_t速度不同?【英文标题】:whyauint32_tvsuint64_tspeeddifference?为什么uint32_t与uint64_t速度不同?【发布时间】:2013-11-1714:14:28【问题描述】:试图了解g++/cpu在运行时如何处理整数。我正在测量以下函数的运行时间... 查看详情

C++ SIMD:在数组中累积 uint64_t 元素的 POPCOUNT

】C++SIMD:在数组中累积uint64_t元素的POPCOUNT【英文标题】:C++SIMD:accumulatePOPCOUNTsofuint64_telementsinanarray【发布时间】:2017-02-2602:09:30【问题描述】:我正在尝试使用SSE指令在数组中为uint64_t整数累积POPCOUNTs。这是我的代码:#include<... 查看详情