iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >如何调用作为参数接收的 C 函数
  • 898
分享到

如何调用作为参数接收的 C 函数

2024-04-04 23:04:36 898人浏览 薄情痞子
摘要

编程网今天将给大家带来《如何调用作为参数接收的 C 函数》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建

编程网今天将给大家带来《如何调用作为参数接收的 C 函数》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

我想使用 Go 库,并在 c 中进行一些调整。 我制作了 goadder go 函数,它有 3 个参数 int x、y 和函数类型 f。

goadder 函数将调用 f 参数。

adder.go

package main

import "fmt"

import "c" 

//export ftest
type ftest func(c.int);

//export goadder
func goadder(x, y int, f ftest) int {
    fmt.printf("go says: adding %v and %v\n", x, y) 
    f(10); 

    return x + y
}

func main() {} // required but ignored

我在上面将 go 包构建为名为 libadder.a 的静态库,如下所示:

go build -buildmode=c-arcHive -o libadder.a adder.go

然后我编写了下面的 c++ 代码。

ma​​in.c

#include <stdio.h>
#include "adder/libadder.h"

void a( goint a ){
  printf("hello %d", a);
}

int main() {
  printf("c says: about to call go...\n");
  int total = goadder(1, 7, &a);
  printf("c says: go calculated our total as %i\n", total);
  return 0;
}

我已经编译了这样的来源:

GCc -pthread -o static_go_lib main.c adder/libadder.a

执行上面的代码时出现错误

unexpected fault address 0x0
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x563c99b74244]

goroutine 17 [running, locked to thread]:
...

如何在go函数goadder中获取正确的c函数地址a

我引用了https://GitHub.com/draffensperger/go-interlang/tree/master/c_to_go/static_go_lib


解决方案


c 函数只是跳转指针,而 golang 的回调是复杂的结构体,并且无法转换它们。 只有一种(安全)方法来调用 c 函数指针: 1)在某处声明:

//go:linkname cgocall runtime.cgocall
//go:nosplit
func cgocall(fn, arg unsafe.pointer ) int32

2)另外,请注意类型安全:

func goadder(x, y c.int, f unsafe.pointer ) c.int

3) c 函数应该将指针(指向任何内容)作为参数

void a(goint *a)

(我会使用本机类型)

4)

ten := 10
cgocall(f, unsafe.Pointer(&ten))

(如果你想传递多个参数,它应该是结构体)

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持编程网!更多关于Golang的相关知识,也可关注编程网公众号。

您可能感兴趣的文档:

--结束END--

本文标题: 如何调用作为参数接收的 C 函数

本文链接: https://www.lsjlt.com/news/596647.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何调用作为参数接收的 C 函数
    编程网今天将给大家带来《如何调用作为参数接收的 C 函数》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建...
    99+
    2024-04-04
  • PHP 匿名函数如何接收参数?
    php 匿名函数接收参数的语法为: function($argument1, $argument2, ..., $argumentn) { // 函数体}。参数按值或按引用传递(使用 &...
    99+
    2024-04-10
    php 匿名函数
  • python如何使用函数作为函数形参
    这篇文章将为大家详细讲解有关python如何使用函数作为函数形参,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用函数作为函数形参有时候需要定义一个函数,该函数的大部分计算逻辑都能确定,但某些处理逻辑暂时...
    99+
    2023-06-17
  • shell如何使用数组作为函数参数
    这篇文章主要介绍shell如何使用数组作为函数参数,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!因工作需要,需要使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能...
    99+
    2023-06-09
  • C++ 函数指针作为函数指针参数
    c++++ 中函数指针作为参数允许动态调用函数,语法是 typedef 返回类型 (*函数指针名)(参数列表);。函数指针可用作其他函数的参数,例如 apply_function(int...
    99+
    2024-04-14
    c++ 函数指针 typedef
  • Go 中调用的函数如何访问调用函数的参数?
    Go 中调用的函数可以通过函数参数来获取调用函数的参数。在 Go 中,参数可以通过传值或传引用的方式传递给函数,函数可以通过参数来获取调用者传递的值或指针。如果参数是值类型,函数内部的...
    99+
    2024-02-09
  • Feign如何使用protobuf的类作为参数调用
    目录feign客户端接口定义如下服务端接口实现如下在feign接口调用时feign客户端增加一个配置如下服务端增加一个配置如下不要加入版本这两天在把原来的项目迁移到spring cl...
    99+
    2024-04-02
  • C++ 函数的引用参数的作用
    c++++ 引用参数允许函数直接修改调用函数处的变量,而无需创建副本。作用包括:修改实际参数,提供对原始变量的直接访问。提高效率,避免创建副本,减少内存开销和时间复杂度。避免意外修改,将...
    99+
    2024-04-20
    c++ 引用参数
  • python中以函数作为参数(回调函数)的实现方法
    目录python以函数作为参数(回调函数)python函数的参数类型一、必须参数二、关键字参数三、默认参数四、不定长参数总结python以函数作为参数(回调函数) 纯粹是自己学习总结...
    99+
    2023-01-04
    python函数 python函数为参数 python回调函数
  • 函数接收多类型的数组参数
    在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天编程网就整理分享《函数接收多类型的数组参数》,聊聊,希望可以...
    99+
    2024-04-04
  • vue如何将函数作为参数传递
    在vue中将函数作为参数传递的方法:1.新建vue.js项目;2.定义函数用于测试;3.封装函数;4.使用this.clickEnter方法做参数传递;具体步骤如下:首先,在vue-cli中创建一个vue.js项目;vue create p...
    99+
    2024-04-02
  • 如何调试 PHP 函数的参数?
    要调试 php 函数参数,有以下技巧:使用 var_dump() 查看参数类型和值。使用 debug_backtrace() 跟踪参数的流向。在调试器中设置断点,并在代码不同部分检查参数...
    99+
    2024-04-23
    调试 php
  • C++ 中如何定义和调用可变参数函数?
    在c++++中,使用...(省略号)定义可变参数函数,允许函数接受任意数量的参数;调用时,将其视为固定参数函数即可。 如何在 C++ 中定义和调用可变参数函数? 可变参数函数(又称变参...
    99+
    2024-04-12
    c++ 可变参数函数 标准库
  • Golang函数的函数作为参数分析
    Golang作为一门高效的编程语言,具有简洁、安全且高效的特点,是近年来备受开发者追捧的新生力量。一项非常常见的编程任务就是将函数作为参数传递给其他函数,这是Golang中的一种非常重要的编程技术。本文将会深入探讨Golang函数的函数作为...
    99+
    2023-05-16
    Golang 函数参数 函数作为参数
  • C++11 成员函数作为回调函数的使用方式
    目录C++11成员函数作为回调函数使用示例1示例2类成员函数作为回调函数的方法及注意点类成员函数当回调函数的方法为什么回调函数必须为静态函数?类的静态成员函数如何访问非静态成员?C+...
    99+
    2022-11-13
    C++11 成员函数 C++11 回调函数 使用回调函数
  • springboot如何接收json参数
    在Spring Boot中,可以使用`@RequestBody`注解来接收JSON参数。例如,假设有一个POST请求,请求体是一个J...
    99+
    2023-09-22
    springboot json
  • python如何调用无参函数
    在python中调用无参函数的方法首先,在python中定义一个无参函数;def num():print('Hello Python')无参函数定义好后,通过调用num即可实现调用无参函数;def num():print('Hello Py...
    99+
    2024-04-02
  • springmvc如何使用map接收参数
    目录springmvc 使用map接收参数第一种情况:请求参数有多组第二种情况:所有的参数不分组用map接收参数的几个注意的问题1、接受map的参数不能写value2、对于多个同名字...
    99+
    2024-04-02
  • 如何使用Mybatis接收Integer参数
    小编给大家分享一下如何使用Mybatis接收Integer参数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Mybatis接收Integer参数最近在做项目的时候...
    99+
    2023-06-29
  • BIRT如何接收数组型参数
    这篇文章给大家介绍BIRT如何接收数组型参数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。由于BIRT不直接支持数组型参数参与查询,即:无法把一个数组直接传给DataSet执行带in的SQL,所以很难直接在数据集中把S...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作