【问题标题】:Passing a struct through cgo通过 cgo 传递结构
【发布时间】:2020-06-04 05:15:03
【问题描述】:

我正在使用 cgo 从 go 中调用 c。我想通过函数传递一个结构。 在我的 c 文件中,它看起来像这样:

#include <stdio.h>

void test(TestStruct val) {
  printf(val);
}

在我的 go 文件中,我正在这样做:

package main

// #cgo CXXFLAGS: -I/usr/lib/
// #cgo LDFLAGS: -L/usr/lib/ -lstdc++
//#include <file.c>
import "C"

type TestStruct struct {
  val  string
  type string
}

func main() {
  var value = TestStruct{ "foo", "bar" }

  C.test(value);
}

但这不起作用。它抛出这个错误:

无法确定 C.test 的名称类型

【问题讨论】:

  • 除了 C 代码不知道正确的类型之外,Go 字符串不是 C 字符串,并且您不能将包含 Go 分配的指针的值传递给 C。

标签: c go cgo


【解决方案1】:

TestStruct 未在 C 代码中定义。尝试添加定义。

您还需要在结构中使用 cgo 的 C 字符串而不是 Go 的内置字符串。

顺便说一句:您的 C 代码中还有两个错误。 printf(val) 不起作用,因为 printf 不能用于直接打印结构。此外,出于安全原因,您应该永远不要对printf 的第一个参数使用除字符串文字之外的任何内容。将该行替换为 puts(val.val) 或 printf("%s", val.val) 之类的内容。

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2013-05-12
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多