为啥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 语言不支持在调用函数时返回局部变量的地址?

C语言中关于结构体指针为啥不能在函数内赋初值的问题?

为啥我不能访问指向数组中成员函数的指针?

为啥指针不能传递正确的值(C)?

c语言中,为啥不能对字符指针变量指向的字符串再赋值?

C语言指针初学者 请帮我看看下面的提 为啥调用函数返回值是char型的 这样不就只能返回一个字符了吗