gpt4 book ai didi

go - 将 strfmon 与 cgo 一起使用

转载 作者:IT王子 更新时间:2023-10-29 02:01:31 26 4
gpt4 key购买 nike

我正在尝试通过 cgo 使用 C 函数 strfmon

有效的示例 C 代码是:

#include <stdio.h>
#include <monetary.h>

int main(void)
{
char str[100];
double money = 1234.56;
strfmon(str, 100, "%i", money);
printf("%s\n", string);
}

到目前为止我写的 Go 代码是:

package main

// #cgo CFLAGS: -g -Wall
// #include <stdlib.h>
// #include <monetary.h>
import "C"
import (
"fmt"
)

func main() {
str := [100]C.char{}
var money C.double = 1234.56
C.strfmon(str, 100, "%i", money)
fmt.Printf("%+v\n", str)
}

当我 go run main.go 时,出现以下错误:

./main.go:14:2: 意外类型:...

我相信 ... 指的是 strfmon 中的可变参数,但我不确定如何在 Go 中解决这个问题。

最佳答案

根据cgo command documentation :

Calling variadic C functions is not supported. It is possible to circumvent this by using a C function wrapper.

strfmon(3p)正如签名中的 ... 字符所示,它确实是一个可变参数函数:

ssize_t strfmon(char *restrict s, size_t maxsize,
const char *restrict format, ...);

因此,您可以在 C 中创建一个包装函数,它具有固定数量的参数并根据需要调用 strfmon(...),例如:

package main

// #cgo CFLAGS: -g -Wall
//
// #include <locale.h>
// #include <monetary.h>
// #include <stdlib.h>
//
// size_t format_amount(char * s, size_t maxsize, char * format, double amount)
// {
// setlocale(LC_ALL, "en_US");
// return strfmon(s, maxsize, format, amount);
// }
//
import "C"
import "fmt"
import "unsafe"

const SIZE = 100

func main() {
str := C.CString(string(make([]byte, SIZE)))
money := C.double(1234.56)
format := C.CString("[%n]")

C.format_amount(str, SIZE-1, format, money) // Call our wrapper here.
fmt.Printf("OK: %s\n", C.GoString(str))
// OK: [$1,234.56]

C.free(unsafe.Pointer(str))
C.free(unsafe.Pointer(format))
}

关于go - 将 strfmon 与 cgo 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52113027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com