c 回调函数&函数指针

2023-11-04

概述

之前写Android程序的时候,我们常常对一些异步操作,或事件监听,都会通过回调函数,回调处理结果;最近写c/c++项目的时候,也需要实现回调函数,却不知道怎么下手,经过自己学习,了解到c/c++可以通过函数指针实现回调函数的功能,在此做记录。

函数指针

函数指针是指向函数的指针变量,即本质是一个指针变量。
指向函数的指针包含了函数的地址的入口地址,可以通过它来调用函数。
声明格式如下:
类型说明符 (*函数名) (参数)
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明必须和它指向函数的声明保持一致。
指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。

利用函数指针,实现回调函数例子:
NetWork.h

#include <string>
#include <Windows.h>
#include <thread>
using namespace std;

//定义回调函数
typedef void(*CallBack)(string result);
//定义网络请求函数
void RequestNetWork(string params, CallBack fun);
//网络获取数据
void GetServiceData(string params, CallBack fun){
    //子线程模拟网络请求
    thread t1(RequestNetWork, params, fun);
    t1.detach();


}

void RequestNetWork(string params, CallBack fun){

    Sleep(1000 * 5);
    fun(params + "——我来之网络!");

}

Testmain.cpp

#include <stdio.h>
#include "NetWork.h"
using namespace std;


//网络回调数据
void CallBackResult(string result){
    printf("%s\n", "成功获取网络数据———————————————————————");
    printf("%s\n", result.c_str());
}


int main(){

    //获取网络数据
    GetServiceData("请求网络数据", &CallBackResult);
    int i = 0;
    while (true){
        Sleep(1000);
        i++;
        if (i <= 5){
            printf("等待%d秒\n", i);
        }
    }
    return 0;
}

运行结果:
这里写图片描述
补充说明:
指针函数与函数指针区别
指针函数是指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。函数指针,本质上是一个指针,指针指向数据,为一个函数的地址。
声明格式:
类型标识符 *函数名(参数表)

int *fun(int xint y);

希望对您有所帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c 回调函数&函数指针 的相关文章

  • Excel的解析路径

    其实我想问以下问题 对于位于 目录中定义的 PATH 怎么能 我找出这些目录中的哪个 找到了 因为我需要使用 Process Run 从 C 运行 Excel 并且只需指示 Excel 即可正常工作 Windows 似乎知道在哪里可以找到它
  • C 语言中的套接字如何工作?

    我对 C 中的套接字编程有点困惑 You create a socket bind it to an interface and an IP address and get it to listen I found a couple of
  • C++11 中具有 C 链接的复杂类型

    我需要将 C 库的标头包含到我的 C 11 代码中 现在 标头提供了涉及大量的例程和数据结构double complex到处都是 例如 include
  • 如何在 C++ 中对四元结构进行有效排序?

    我有一个包含 x y z 和 w 成员的结构 如何高效排序 在 C 中首先按 x 然后按 y 按 z 最后按 w 如果你想实现字典排序 那么最简单的方法是使用std tie实现小于或大于比较运算符或函子 然后使用std sort http
  • 枚举 EMF 时丢失文本

    我在列举发票 emf http www mediafire com kdjwvvo7odyvwa6并将其复制到另一个但文本丢失了 令人惊讶的是 当我将其输出到窗口时 它绘制得非常完美 int CALLBACK EnhMetaFileProc
  • 使用 C# 和反射打印完整的对象图

    我有一个复杂的对象 class A int Field1 int field2 property ClassB ClassB property classC classC etc etc 我想使用反射打印完整的对象图 有什么好的代码吗 一种
  • 通过 TCP/.NET SSLStream 发送文件很慢/无法正常工作

    我正在编写一个与 SSL 配合使用的服务器 客户端应用程序 通过SSLStream 它必须做很多事情 不仅仅是文件接收 发送 目前 它的工作原理是 只有一个连接 我总是使用从客户端 服务器发送数据SSLStream WriteLine 并使
  • Debug.WriteLine() 未命中

    我正在调试 Windows 服务 通过点击F5在 Visual Studio 2010 中 使用以下代码 In 程序 cs file static void Main if Environment UserInteractive We ar
  • 如何让BackgroundWorker返回一个对象

    我需要做RunWorkerAsync 返回一个List
  • 从 C++ 中的函数返回二维数组[重复]

    这个问题在这里已经有答案了 可能的重复 C 从函数返回多维数组 https stackoverflow com questions 3716595 c returning multidimension array from function
  • 如何使用 Linq to Sql 修剪值?

    在数据库中 我有一个名为 联系人 的表 名字和其他此类字符串字段设计为使用 Char 数据类型 不是我的数据库设计 我的对象 Contact 映射到属性中的字符串类型 如果我想做一个简单的测试 通过 id 检索 Contact 对象 我会这
  • 为什么这段代码不会产生编译错误?

    template
  • 如何在PropertyGrid中自定义绘制GridItem?

    我想以与所有者在 ListView 详细信息 和其他控件中绘制项目类似的方式在 PropertyGrid 中绘制属性值 如果将属性声明为 Color 类型 则其值将使用字符串描述旁边的颜色样本来绘制 如果属性是图像类型 则在字符串描述旁边绘
  • 当一种语言是另一种语言的平行超集时,这意味着什么?

    我正在阅读关于实时并发 C 的期刊文章 http link springer com article 10 1007 2FBF00365999 并且它在摘要中提到 因此你们中的任何人都可以通过该链接查看上下文 Concurrent C 是
  • 为什么 g++ 在编译的二进制文件中存储类名?

    我注意到如果我跑strings在我编译的程序上g 输出包含它使用的各种类的名称 该程序是用 O3并且没有 g or p 并且当我剥离二进制文件时 类名仍然存在 我想知道为什么有必要g 将此信息存储在二进制文件中 出现的类名似乎都是使用虚函数
  • 如何查明我的字符串是否包含“micro”Unicode 字符?

    我有一个包含实验室数据的 Excel 电子表格 如下所示 g L ppb 我想测试希腊字母 是否存在 如果发现我需要做一些特别的事情 通常 我会写这样的东西 if cell StartsWith matchSequence lt unive
  • AllowUserToAddRows 不适用于 DataGridView 上的 List<> 数据源

    我有一个DataGridView与DataSource set to List
  • 在 C# 中设置风扇速度

    我知道以前有人问过这个问题 但我似乎无法让它发挥作用 我已调用以下内容 using System Management using System Management Instrumentation using System Runtime
  • 我可以创建一个 List> 吗?

    我正在尝试创建一个列表WeakReference使用 4 5 泛型实现 这样我就可以避免类型检查和转换WeakReference目标 但 WeakReference
  • 创建进程的多个子进程并维护所有 PID 的共享数组

    我已经分叉了几次 并用 C 创建了一堆子进程 我想将它们所有的 PID 存储在一个共享数组中 PID 的顺序并不重要 例如 我创建了 32 个进程 我想要一个 32 个整数长的数组来存储每个 PID 并且每个进程都可以访问 最好的方法是什么

随机推荐

  • 已解决:Java环境变量配置后不生效

    一 问题 从jdk8升级到jdk11 配置JAVA HOME后 不生效 备注 jdk8是安装版 jdk11是解压版 二 解决办法 在环境变量Path中 删除下面的配置 C Program Files x86 Common Files Ora
  • Python 的reload()方法

    reload 函数将以前导入过的模块再加载一次 重新加载 reload 包括最初导入模块时应用的分析过程和初始化过程 这样就允许在不退出解释器的情况下重新加载已更改的Python模块 若干注意事项 1 如果模块在语法上是正确的 但在初始化过
  • 攻防世界_Crypto_sherlock

    攻防世界刷题记录Crypto篇 文章目录 攻防世界刷题记录Crypto篇 前言 解题步骤 1 筛选出文中的大写字母 2 借助Python处理字符串 总结 前言 继续高手进阶区题目 sherlock 咦 夏洛克 下载题目附件得到的是一个内容很
  • Docker root用户的pip使用方法

    Docker下root用户 pip install XX 显示pip命令不存在 原始目标 pip install XX pip install root user action ignore XX 要安装的包 参考 WARNING Runn
  • JavaScript中的正则表达式

    ECMAScript 通过RegExp类型来支持正则表达式 测试的方法 pattern test str 或 pattern exec str 其中str 是待匹配的字符串 pattern 是正则表达式 JavaScript 中的正则表达式
  • 找不到msvcp140.dll无法继续执行代码怎么解决?分享三个解决方法

    当你在运行某个程序或游戏时遇到msvcp140 dll缺失的错误提示 你可能会感到困惑和烦恼 在修复msvcp140 dll的过程中 我遇到了一些挑战 但最终成功解决了这个问题 以下是我总结的三个解决方法 希望能帮助你解决这个问题 找不到m
  • sklearn中的归一化方法StandardScaler中的fit、transform和fit_transform

    StandardScaler类 常用的数据归一化方式 减去平均值 然后通过标准差映射到均至为0的空间内 系统会记录每个输入参数的平均数和标准差 以便数据可以还原 sklearn preprocessing StandardScaler能够轻
  • 【极速版】vite安装配置ceisum教程

    Hello大家好 今天带来的是vite版本的cesium的安装教程 借助一个国人大佬写的插件vite plugin cesium 安装非常简单快捷 一起来看看吧 1 安装vite插件 官网 https github com nshen vi
  • opencv遍历彩色图像、灰度图像像素值的方法

    https www bbsmax com A RnJWZb2ozq
  • 嵌套滑动学习

    我们知道两个同一方向的可以滑动的View 如果不做任何处理 会出现滑动冲突 处理滑动冲突我们有内部和外部拦截法 如果有朋友还不知道事件分发的原理可以看包括滑动冲突的拦截事件分发源码的学习分享 处理滑动冲突之后还是存在缺陷 比如一次滑动操作父
  • JavaScript面试题

    1 数据类型有哪几种 检测方法是什么 基本数据类型 ES5 Number Boolean String Undefined Null ES6新增 symbol 引用数据类型 Object 检测方法4种 1 Object prototype
  • 无向图和有向图

    1 无向图 两点之间的边没有方向 点 Vertex 简称V 边 Edge 简称E 2 有向图 两点之间的边是有方向的 有多少边以某点为出发点 则有多少的出度 同理有多少边以某点为终点则有多少入度 度 出度 入度 3 邻接矩阵 用G V E
  • 几种常用回归算法的比较

    type introduce example k nearest neighbors 原理 是一种常用的监督学习方法 给定测试样本 基于某种距离度量找出训练集中与其最靠近的k个训练样本 然后基于这k个 邻居 的信息来进行预测 判定方法 1
  • 98个创新JAVA计算机毕业设计项目,通俗易懂,被朋友羡慕了

    面对如海的计算机毕业设计题目 你是否感到困惑 不知如何选择一个具有创新性的项目 今天 我们将为大四的同学们分享一些毕业设计项目 希望能对你的毕业设计有所帮助 一 成品列表 以下所有springboot框架项目的源码博主已经打包好上传到百du
  • Visual Studio对代码进行注释

    1 Ctrl K C 可以同时按住三键 也已分开来按Ctrl K Ctrl C 对选中的代码段进行注释 Ctrl K U 可以同时按住三键 也已分开来按Ctrl K Ctrl U 对选中的代码段取消注释 2 Ctrl Shift 切换块注释
  • Nacos 入门应用

    Nacos入门应用 一 概述 Nacos提供了统一配置管理 服务发现与注册 其中服务注册和发现的功能 相当于dubbo里面使用到的zookeeper 或者spring cloud里面应用到的eureka 之前在Spring Cloud Eu
  • lucene 目录结构简单介绍

    今天回顾了一下lucene 搜索引擎的基础技术 有必要总结一下 搜索引擎的相关知识点 lucene 目录结构 如下图所示 lucene 目录结构详细说明 core Lucene核心类库 analyzers common 不同语言和领域通用的
  • KNN算法实例——鸢尾花种类预测

    线性回归的scikit learn实现 scikit learn中提供了一个KNeighborClassifier类来实现k近邻法分类模型 方法 fit X y 训练模型 predict 使用模型来预测 返回待预测样本的标记 score X
  • 使用Java实现斗地主发牌逻辑(简单基础版)

    大家好 我是垃圾佬 一个正在学Java的 无业游民 最近复习到了Map 集合 我觉得斗地主发牌这个案例来练习Map集合还是非常好的 话不多说先上图解 1 斗地主发牌 图解 图解 1 首先定义扑克牌映射表 按编号的顺序从小到大依次是牌面的从大
  • c 回调函数&函数指针

    概述 之前写Android程序的时候 我们常常对一些异步操作 或事件监听 都会通过回调函数 回调处理结果 最近写c c 项目的时候 也需要实现回调函数 却不知道怎么下手 经过自己学习 了解到c c 可以通过函数指针实现回调函数的功能 在此做