函数指针参数与函数参数必须保持一致吗?
已知注册中断函数如下图,传入其中的形参irq_func fp为函数指针,其参数为int类型。定义定时器中断函数如下图,函数timer_irq的参数为空。
当register_irq传入定时器函数timer_irq时候,irq_func fp(int)中形参int与timer_irq(void)中的void类型不一致却能通过这是何解?不是说函数指针形参要与函数形参保持一致吗?
C语言的返回数据类型一般都要一致。但这个不需要返回值
void函数名前面的那个单词叫做函数的返回值类型,作用就是返回函数的执行结果或者用户想要传递的值。
但是用户不想要返回值的时候就写void(无返回值)就行了,这就是void的作用,所以当用户不需要函数返回什么东西的时候就写void。 jyhh09 发表于 2023-12-1 23:02
C语言的返回数据类型一般都要一致。但这个不需要返回值
void函数名前面的那个单词叫做函数的返回值类型, ...
大哥,是函数后面原本要传入的参数的void和函数指针后面的参数int不一致,不是前面{:1_918:} silverviolet 发表于 2023-12-1 23:16
大哥,是函数后面原本要传入的参数的void和函数指针后面的参数int不一致,不是前面
说了呀。。它这个意思是不返回值,只执行函数结果 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); //注意看这里
}
接下来看下面这个代码
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函数下断试试,你就知道了
jyhh09 发表于 2023-12-1 23:19
说了呀。。它这个意思是不返回值,只执行函数结果
同样的register_irq()注册中断函数输入参数如下不会显示错误
定义的函数指针和函数,代入后显示错误。 如果是C语言编译,void (*fp)(int)和void (*fp)(void)同为函数指针,编译不检查参数类型,所以看到参数不同,也能编译通过;
如果是C++编译,如果定义函数前没有加extern “C”,编译会生成函数装饰名,装饰名是包含参数信息的,编译时也会检查参数类型,所以定义和调用的参数类型不一致,编译会报错 bester 发表于 2023-12-1 23:40
void _times(void)
{
//随便写的
谢谢大哥提点,我试下你的看看,后续我有对上面的哥们回复的做解释了,定义了函数指针,传入函数的是地址,显示E0167错误,实参形参不兼容,但在timer.c里没显示错误。 go4399 发表于 2023-12-1 23:51
如果是C语言编译,void (*fp)(int)和void (*fp)(void)同为函数指针,编译不检查参数类型,所以看到参数不同 ...
{:1_908:},哥,我用的是C++,针对这样的情况是函数指针还是函数前加extern?具体怎么修改才行?:wwqwq silverviolet 发表于 2023-12-2 00:04
,哥,我用的是C++,针对这样的情况是函数指针还是函数前加extern?具体怎么修改才行?:wwq ...
6楼的例子已经很清楚了
把源文件后缀名改成.cpp或.cxx,编译时会检查参数类型不匹配的问题
页:
[1]
2