C语言奇技淫巧之--“函数指针数组”的类型定义与结构化初始化某一个函数

精力有限,就不写前言后序了,懂的都懂,直接上代码。

快速回忆点:

# 类型定义
typedef int (*my_func_t)(int a, void *b)# 函数指针数组结构体定义
struct my_ops {int (*func[FUNC_TYPE_MAX])(int a, void *b);
};# 函数指针数组结构化初始化
struct my_ops real_ops = {.func = {[FUNC_TYPE_2] = real_func,}
};

定义函数类型

定义

# 错(这种定义方式可以定义非函数类型)
typedef int (*)(int a, void *b) my_func_t# 对(函数类型的类型名直接就是在(*)里面
typedef int (*my_func_t)(int a, void *b)

使用类型

my_func_t fp_mytest_func = NULL;
//注意这里定义的已经是一个指针 不用单独加 *

因为他是一个*的指针 相当于是: int ()(int a, void *b)

然后假设定义了一个真实的函数,并且通过函数指针访问:

real_func(int a, void *b)
{printf("%d, %d\n", a, *b);
}//赋值
fp_mytest_func = real_func;//调用
fp_mytest_func(1, 2);

struct中定义函数指针数组并且结构化初始化

定义函数指针数组

enum {FUNC_TYPE_1,FUNC_TYPE_2,FUNC_TYPE_MAX
};
struct my_ops {int (*func[FUNC_TYPE_MAX])(int a, void *b);
};
//注意一般是使用多个func,比如linux内核,但是很少用函数指针数组,尤其是还包括结构化初始化

结构化初始化

//假设前面定义了某个函数
real_func(int a, void *b)
{printf("%d, %d\n", a, *b);
}
// 结构化初始化中间某一个
struct my_ops real_ops = {.func = {[FUNC_TYPE_2] = real_func,}
};
//还有一种方法 初始化所有的,就类似 定义数组一样 用{1,2,3}
这里就类似: 
struct my_ops real_ops = {.func = {real_func, real_func},
};//假设所有的都初始化成一个变量比如都为空,还有一个技巧,不过需要定义数组的时候才能使用这里不能使用但是原理类似
struct my_ops real_ops[MAX] = {
[1 ... MAX] = NULL;
};

进一步细化

还有一个迭代方式

typedef int (*my_func_t)(int a, void *b)
struct my_ops {my_func_t func[FUNC_TYPE_MAX]);
};

场景:
比如两个内核模块,模块A和模块B之间通过这个struct my_ops相互传递函数,进行函数指针回调。并且不适用标准的fops,而是灵活的函数指针数组,能够包容很多未知名字的函数。两个模块之间仅仅通过index宏定义进行传递。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java8 Stream流的sorted()的排序【正序、倒序、多字段排序】

针对集合排序,java8可以用Stream流的sorted()进行排序。 示例Bean 以下我们会使用这个Bean来做示例。 public class Order {private String weight;private Double price;private String dateStr;//忽略getter、setter、构造方法、toString }字段排序 首先是比较器…

职场新员工倒挂老员工工资

职场的工资倒挂和工资构成 一个公司招新员工要开多少工资 主要取决于其他大厂出多少钱以及当年就业市场的行情。职场中常出现工资倒挂现象,即新员工的工资高于老员工。公司宁愿高薪招新员工而不给老员工加工资,主要是因为新员工的工资由市场决定&#…

【优选算法专栏】专题十:哈希表(一)

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…

[yotroy.cool]Haskell笔记一 —— 入门 算数 运算符 未定义变量 列表 字符串 类型

个人博客https://www.yotroy.cool/,欢迎关注我哦~ 添加模块 ghci> :module Data.Ratio算数 - * / ** ^ % 基本的 ghci> 7.0 / 2.0 3.5 ghci> 7 / 2 3.5ghci> 2 2 4 ghci> () 2 2 4** 和 ^ - ** 可用于浮点数幂 ghci> 2.2**3.3 …

分治法python

分治法(Divide and Conquer)是一种重要的算法设计技巧,它将一个难以直接解决的问题分解成两个或更多的相同或相似的子问题,递归地解决这些子问题,然后将子问题的解组合起来,从而解决原问题。 以求最大值为例,假设我们有一个整数数组,我们想找到数组中的最大值。使用分…

mutable关键字的作用(c++)

常成员变量、常成员函数与常对象 常成员变量 声明为常成员变量的成员变量,在对象被创建后就不能被修改常成员变量必须在对象的构造函数初始化列表中赋值,不能在构造函数体中赋值初始化列表的执行是在函数体执行之前就执行了的。上面这种写法和下面的写…

卫星遥感影像在农业方面的应用及评价

一、引言 随着科技的进步,卫星遥感技术在农业领域的应用越来越广泛。卫星遥感技术以其宏观、快速、准确的特点,为农业生产和管理提供了有力的技术支撑。本文将对卫星遥感在农业方面的应用进行详细介绍,并通过具体案例进行说明。 二、…

(二)ffmpeg 下载安装以及拉流推流示例

一、ffmpeg下载安装 官网:https://www.ffmpeg.org/ 源码下载地址:https://www.ffmpeg.org/download.html#releases 下载源码压缩包 下载完成之后解压并在该目录下打开命令窗口 安装依赖环境: sudo apt-get install build-essential nasm …

【CAD建模号】学习笔记(二)——工作区

工作区介绍 工作区由[工具提示],[自适应网格],[自适应坐标轴],[参考坐标轴],[绘制的图形]组成。 一、工具提示 工具提示是提示当前工具的操作步骤,同时也提供了更加精确的参数输入方式建模、绘图时直接生成面&#x…

规则系统架构

规则系统架构 目录概述需求: 设计思路实现思路分析1.规则系统架构2. 规则系统架构优势 性能参数测试: 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,mak…

计算机常识

常见屏幕比例:16:9和16:10 分辨率:屏幕上水平和垂直方向的像素数量,决定了屏幕显示图像的细致程度和清晰度 简称 HD(High Definition):高清 FHD(Full High Definition):全高清 QHD (Quarter H…

Linux防止暴力破解密码脚本

1.认识记录linux记录安全的日志 [roottestpm ~]# cd /var/log/ [roottestpm log]# ls | grep secure secure 2.该日志的内容查看 [roottestpm log]# tail -f secure #表示ssh身份验证失败 Aug 29 23:35:03 testpm sshd[111245]: pam_unix(sshd:auth): authentication fa…

Java内存泄漏内存溢出

1.定义 OOM内存溢出是指应用程序尝试使用更多内存资源,而系统无足够的内存,导致程序崩溃。 内存泄漏是指应用程序中分配的内存未能被正确释放,导致系统中的可用内存逐渐减少。 2.内存泄漏的原因 可能包括对象引用未被释放、缓存未被清理等。 …

【MYSQL】其他索引的创建使用方式

MySQL其他索引的创建使用方式 前面的案例中,聊到了咱们有三种方式创建索引,在创建时可通过INDEX、KEY两个关键字创建,但这种方式建立的索引仅是普通索引,接着再来聊一聊MySQL数据库其他类型的索引该如何创建以及使用。 但不管是何…

3D应用模型信创系统实时渲染有什么要求?

实时云渲染技术是数字孪生领域,比较常用的轻量化软件交付方式,该技术是将3D应用等大模型的算力执行放在了服务器端,而服务器目前比较常用的还是Windows系统。但随着国产信创在数字孪生领域应用越来越多,实时云渲染平台的国产信创化…

学习基于pytorch的VGG图像分类 day4

注:本系列博客在于汇总CSDN的精华帖,类似自用笔记,不做学习交流,方便以后的复习回顾,博文中的引用都注明出处,并点赞收藏原博主. 目录 VGG模型检测 一:导入必要的库和模块 二:主函数…

Games101Homework【6】Acceleration structure(Including framework analysis)

Code Analysis&#xff1a; friend&#xff1a; C中友元&#xff08;友元函数和友元类&#xff09;的用法和功能_friend class a<b>-CSDN博客 [C&#xff1a;不如Coding]&#xff08;11&#xff09;&#xff1a;友元函数与友元类_哔哩哔哩_bilibili Here is a simple…

Rust开发笔记 | 系统编程的守护神

在如今这个信息技术不断发展的时代&#xff0c;系统编程语言演进的步伐从未停歇。Rust&#xff0c;作为现代化的系统编程语言&#xff0c;正凭借其出色的性能、安全性和并发处理能力赢得编程界的广泛赞誉。有别于传统的系统编程语言&#xff0c;Rust在保证高性能的同时&#xf…

二维数组---刷题

一维数组不想更了&#xff0c;弄点二维数组&#xff01; 1.对角线 已知一个6*6的矩阵&#xff0c;把矩阵两条对角线上的元素加上10&#xff0c;然后输出这个新矩阵。 思路 题目简单&#xff0c;6*636&#xff0c;可以得知有36个元素。数组就定义成a[7][7]&#xff0c;难点在与…

软考数据库---3.关系数据库

3.1 名词 属性分类 数据库实体属性分类主要包括以下几个方面&#xff1a; 标识属性 (Key Attribute / Identifier): 这些属性是用来唯一识别实体实例的关键属性&#xff0c;也称为主键&#xff08;Primary Key&#xff09;。在数据库表中&#xff0c;每个实体的实例&#xff0…