吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 644|回复: 12
收起左侧

[求助] 函数指针参数与函数参数必须保持一致吗?

[复制链接]
silverviolet 发表于 2023-12-1 22:53
          已知注册中断函数如下图,传入其中的形参irq_func fp为函数指针,其参数为int类型。

          定义定时器中断函数如下图,函数timer_irq的参数为空。
时间中断函数.png
            当register_irq传入定时器函数timer_irq时候,irq_func fp(int)中形参int与timer_irq(void)中的void类型不一致却能通过这是何解?不是说函数指针形参要与函数形参保持一致吗?
传入参数.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

jyhh09 发表于 2023-12-1 23:02
C语言的返回数据类型一般都要一致。但这个不需要返回值
void函数名前面的那个单词叫做函数的返回值类型,作用就是返回函数的执行结果或者用户想要传递的值。
但是用户不想要返回值的时候就写void(无返回值)就行了,这就是void的作用,所以当用户不需要函数返回什么东西的时候就写void。
 楼主| silverviolet 发表于 2023-12-1 23:16
jyhh09 发表于 2023-12-1 23:02
C语言的返回数据类型一般都要一致。但这个不需要返回值
void函数名前面的那个单词叫做函数的返回值类型, ...

        大哥,是函数后面原本要传入的参数的void和函数指针后面的参数int不一致,不是前面
jyhh09 发表于 2023-12-1 23:19
silverviolet 发表于 2023-12-1 23:16
大哥,是函数后面原本要传入的参数的void和函数指针后面的参数int不一致,不是前面

说了呀。。它这个意思是不返回值,只执行函数结果
bester 发表于 2023-12-1 23:40
[C++] 纯文本查看 复制代码
void _times(void)
{
	//随便写的
	int x = 0, y = 1;
	int z = x + y;
	
	return;
}
int _register_irq(int a, void* b)
{
	//返回值是int类型,所以随便返回一个数字
	return 0;
}
int main()
{
	_register_irq(10, _times); //注意看这里
}


接下来看下面这个代码

[C++] 纯文本查看 复制代码
void _times(void)
{
	//随便写的
	int x = 0, y = 1;
	int z = x + y;
	
	return;
}
int _register_irq(int a, void* b)
{
	//返回值是int类型,所以随便返回一个数字
	return 0;
}
int main()
{
	_register_irq(10, _times());//这里多了一个括号,但是无法通过编译
}


这个括号就表示,传的参数是这个_times的返回值,程序是会直接走_times这个函数的

如果没有加这个括号,表示传的是这个_times这个函数的函数地址,即使你把_times的返回值改成void*,在你不加括号的情况下

这个_times仍然没有被调用,就这么简单

具体你可以在_times函数下断试试,你就知道了
 楼主| silverviolet 发表于 2023-12-1 23:41
jyhh09 发表于 2023-12-1 23:19
说了呀。。它这个意思是不返回值,只执行函数结果

同样的register_irq()注册中断函数输入参数如下不会显示错误
正确.png
      
定义的函数指针和函数,代入后显示错误。 显示错误.png
go4399 发表于 2023-12-1 23:51
如果是C语言编译,void (*fp)(int)和void (*fp)(void)同为函数指针,编译不检查参数类型,所以看到参数不同,也能编译通过;
如果是C++编译,如果定义函数前没有加extern “C”,编译会生成函数装饰名,装饰名是包含参数信息的,编译时也会检查参数类型,所以定义和调用的参数类型不一致,编译会报错
 楼主| silverviolet 发表于 2023-12-1 23:56
bester 发表于 2023-12-1 23:40
[mw_shl_code=cpp,true]void _times(void)
{
        //随便写的

         谢谢大哥提点,我试下你的看看,后续我有对上面的哥们回复的做解释了,定义了函数指针,传入函数的是地址,显示E0167错误,实参形参不兼容,但在timer.c里没显示错误。
 楼主| silverviolet 发表于 2023-12-2 00:04
go4399 发表于 2023-12-1 23:51
如果是C语言编译,void (*fp)(int)和void (*fp)(void)同为函数指针,编译不检查参数类型,所以看到参数不同 ...

     ,哥,我用的是C++,针对这样的情况是函数指针还是函数前加extern?具体怎么修改才行?
go4399 发表于 2023-12-2 00:44
silverviolet 发表于 2023-12-2 00:04
,哥,我用的是C++,针对这样的情况是函数指针还是函数前加extern?具体怎么修改才行?:wwq ...

6楼的例子已经很清楚了
把源文件后缀名改成.cpp或.cxx,编译时会检查参数类型不匹配的问题
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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