【问题标题】:How do I get proper parameter names in cgo exported functions?如何在 cgo 导出函数中获取正确的参数名称?
【发布时间】:2019-08-15 15:08:28
【问题描述】:

我正在用 Go 编写一个库,我想将其导出到 c-shared-library。它工作得很好,但是我发现导出的标头使用p0p1p2... 作为参数名称而不是 Go 中的原始参数名称有点烦人。有没有办法改变这种行为,还是我只是坚持这样做?

我正在使用go version go1.12.7 darwin/amd64

例子:

package main

/*
#import <stdlib.h>
*/
import "C"
import (
    "fmt"
)

func main() {}

//export MyFunc
func MyFunc(input *C.char) {
    fmt.Println(C.GoString(input));
}
go build -o libout.so -buildmode=c-shared

输出:

extern void MyFunc(char* p0);

为什么p0 不命名为input

根据this cgo documentation,我应该得到变量名。

它状态

Go 函数可以通过以下方式导出以供 C 代码使用:

//export MyFunction
func MyFunction(arg1, arg2 int, arg3 string) int64 {...}

//export MyFunction2
func MyFunction2(arg1, arg2 int, arg3 string) (int64, *C.char) {...}

它们将在 C 代码中作为:

extern int64 MyFunction(int arg1, int arg2, GoString arg3);
extern struct MyFunction2_return MyFunction2(int arg1, int arg2, GoString arg3);

但是,当我编译它给出的确切代码时,我得到了这个结果:

extern GoInt64 MyFunction(GoInt p0, GoInt p1, GoString p2);
extern struct MyFunction2_return MyFunction2(GoInt p0, GoInt p1, GoString p2);

为什么参数没有名字?

【问题讨论】:

    标签: go cgo


    【解决方案1】:

    Go 允许使用任意符文名称,例如,您可以调用变量 π,而不是 input。 C 不允许这样的名称。大概 cgo 作者不想限制你的名字,所以他们只是重命名了所有内容。

    奇怪的是,the documentation 暗示生成的代码将使用您的姓名。如果它这样做就好了,前提是你的名字是可行的。

    【讨论】:

    • 我感觉这可能只发生在指针上,但我可能是错的。我现在不在家测试它。
    • 我已经验证这不是由于指针。请参阅我更新的问题。
    • 我为 Go 创建了一个 PR,几个月前被接受并解决了这个问题。我相信它计划在 8 月的某个时候发布 go1.15。相关的CL可以看这里:go-review.googlesource.com/c/go/+/222619
    • @NathanF.:很好!我可能会建议使用_p%d 作为自动生成的名称,以防有人调用一个参数p2 和另一个π 或其他参数,但大概他们会自己解决这个问题并停止使用p%d 名称:-)
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2017-02-07
    • 2011-01-02
    • 1970-01-01
    • 2023-03-27
    • 2018-07-27
    • 1970-01-01
    相关资源
    最近更新 更多