OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 956|回复: 8

usmart代码函数指针强制类型转换并调用的问题

[复制链接]

7

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2018-6-20
在线时间
44 小时
发表于 2024-3-7 10:19:57 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 ningzhen 于 2024-3-6 17:48 编辑
  1. res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);
复制代码
(u32(*)())usmart_dev.funs[id].func    //我的理解是将usmart_dev.funs[id].func这个void指针强制转换为指向返回值为u32的函数指针                                                                                                                                            
问题在于,函数指针不是需要有参数类型么?u32(*)()第二个这个空括号什么意思?



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8204
金钱
8204
注册时间
2020-5-11
在线时间
3697 小时
发表于 2024-3-7 10:39:37 | 显示全部楼层
我觉得空括号表示函数没有参数,省略了中间的void。
比如:
void test1()
{
char i=5;
while(i--);
}


专治疑难杂症
回复

使用道具 举报

7

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2018-6-20
在线时间
44 小时
 楼主| 发表于 2024-3-7 11:14:23 | 显示全部楼层
本帖最后由 ningzhen 于 2024-3-7 11:17 编辑

强制转换后的函数指针指向的函数是有参数的。莫非这种用法不需要指定参数类型和数量?
函数指针强制转换参数问题.png
回复

使用道具 举报

7

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2018-6-20
在线时间
44 小时
 楼主| 发表于 2024-3-7 11:16:47 | 显示全部楼层
LcwSwust 发表于 2024-3-7 10:39
我觉得空括号表示函数没有参数,省略了中间的void。
比如:
void test1()

res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);
后面temp[0]就是执行时带的参数
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8204
金钱
8204
注册时间
2020-5-11
在线时间
3697 小时
发表于 2024-3-7 13:25:05 | 显示全部楼层
本帖最后由 LcwSwust 于 2024-3-7 13:29 编辑
ningzhen 发表于 2024-3-7 11:16
res=(*(u32(*)())usmart_dev.funs.func)(temp[0]);
后面temp[0]就是执行时带的参数

也许某些高级的语法支持这种方式。
我在用KEIL2、C51下试了下,是不行的。(传递的参数需要与类型中的参数一致)
傲游截图20240307132334.jpg
专治疑难杂症
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2022-9-29
在线时间
25 小时
发表于 2024-3-7 14:39:52 | 显示全部楼层
void fun()函数允许传递任意类型和数量的参数。void fun(void)函数不允许传递参数
回复

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4100
金钱
4100
注册时间
2018-8-14
在线时间
695 小时
发表于 2024-3-7 19:08:28 | 显示全部楼层
参数是u32, u16*
(u32(*)(u32, u16*))

回复

使用道具 举报

7

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2018-6-20
在线时间
44 小时
 楼主| 发表于 2024-3-8 10:28:48 | 显示全部楼层
dsascdf 发表于 2024-3-7 14:39
void fun()函数允许传递任意类型和数量的参数。void fun(void)函数不允许传递参数

小弟的C功底不到家,请问您提到的这个用法在哪里能学习一下?
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2022-9-29
在线时间
25 小时
发表于 2024-3-8 13:39:52 | 显示全部楼层
ningzhen 发表于 2024-3-8 10:28
小弟的C功底不到家,请问您提到的这个用法在哪里能学习一下?

int fun()和int fun(void)在这个场景下的差别居然这么大。其中一个居然编译不通过。 - 阿汤哥的文章 - 知乎
https://zhuanlan.zhihu.com/p/140978439
你看看这个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表