为啥CGO不能直接在C中调用函数指针?
Posted
技术标签:
【中文标题】为啥CGO不能直接在C中调用函数指针?【英文标题】:Why CGO can't directly call function pointer in C?为什么CGO不能直接在C中调用函数指针? 【发布时间】:2020-05-25 03:13:46 【问题描述】:在 C 中定义
typedef err_t(* netif_input_fn) (struct pbuf *p, struct netif *inp);
在 GO 中运行
// netif.input is function pointer defined in C
netif.input(buf, netif)
// got error: cannot call non-function netif.input (type _Ctype_netif_input_fn)
【问题讨论】:
也许this question 可以提供帮助。 @kichik 我想知道为什么 CGO 不允许直接调用更容易。 为什么CGO将函数指针视为非函数?也许这个标题更准确。 目前不支持。这是文档所述的唯一原因。 Go 函数不仅仅是指向代码的指针。如果您获取方法的地址,它还会存储“对象”关联的地址。用方法。 【参考方案1】:Go 中的 CGO 函数是 C 函数,需要特殊处理来处理其堆栈。
Go 中的函数(又名 goroutine)以较小的堆栈大小 (2 kB) 开始,该堆栈将自动扩展或收缩。虽然 CGO 函数不能从这个工具中受益,但它的初始堆栈大小在大多数操作系统上为 2MB,并且将在不同的堆栈(g0 堆栈)上执行。所以 Go 运行时不能把一个 CGO 函数当作普通的 Go 函数(goroutine)直接调用。
【讨论】:
以上是关于为啥CGO不能直接在C中调用函数指针?的主要内容,如果未能解决你的问题,请参考以下文章
C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?