为什么 (*callback)() 工作而不是 *callback() 或 c++ 中的 *callback
why does (*callback)() work and not *callback() or *callback in c++
我是一名初学 C++ 的学生,我认为要真正学习指针和引用,我应该尝试制作一个回调函数,我在 JavaScript.
中认为这是理所当然的事情
但是,对于我来说,我不知道为什么这些括号在 (*callback)()
中如此重要,如果有人能向我解释一下,我会很高兴。
这是我写的一些代码,但不知何故有效:
#include<cstdio>
void function_two()
{
printf("then this runs!");
}
void function_one(void (*callback)() = nullptr)
{
printf("this runs first");
if(callback != nullptr)
{
(*callback)();
}
}
int main()
{
function_one(&function_two);
}
*callback()
在 callback
上调用 operator()
,然后取消引用 (*
) 该函数调用的结果。
(*callback)()
取消引用 callback
,然后在取消引用的结果上调用 operator()
。
两个截然不同的东西。
*callback
只是取消对指针的引用,但对结果不做任何处理。语义上有效,但在此上下文中不执行任何操作。
why does (*callback)() work and not *callback() or *callback in c++
*callback()
不起作用,因为函数 returns void
。 void
表达式不能是操作数。
*callback
"works" 在某种意义上它是一个格式正确的表达式。然而它不是一个函数调用表达式,所以你没有通过这样做调用任何函数。
(*callback)()
起作用是因为通过函数指针的间接寻址导致函数引用,您可以使用空参数列表调用该函数。 callback()
也可以工作,因为可以直接调用函数指针,在这种情况下,通过指针的间接寻址是隐式的。
实际上你可以写
callback();
如果您使用的是一元解引用运算符 *,则它的优先级低于后缀函数调用运算符。所以你必须写
(*callback)();
不然这样的调用
*callback();
编译器认为取消引用函数调用的结果。
请记住,您甚至可以编写如下内容
(******callback)();
因为生成的函数指示符被转换回函数指针。
我是一名初学 C++ 的学生,我认为要真正学习指针和引用,我应该尝试制作一个回调函数,我在 JavaScript.
中认为这是理所当然的事情但是,对于我来说,我不知道为什么这些括号在 (*callback)()
中如此重要,如果有人能向我解释一下,我会很高兴。
这是我写的一些代码,但不知何故有效:
#include<cstdio>
void function_two()
{
printf("then this runs!");
}
void function_one(void (*callback)() = nullptr)
{
printf("this runs first");
if(callback != nullptr)
{
(*callback)();
}
}
int main()
{
function_one(&function_two);
}
*callback()
在 callback
上调用 operator()
,然后取消引用 (*
) 该函数调用的结果。
(*callback)()
取消引用 callback
,然后在取消引用的结果上调用 operator()
。
两个截然不同的东西。
*callback
只是取消对指针的引用,但对结果不做任何处理。语义上有效,但在此上下文中不执行任何操作。
why does (*callback)() work and not *callback() or *callback in c++
*callback()
不起作用,因为函数 returns void
。 void
表达式不能是操作数。
*callback
"works" 在某种意义上它是一个格式正确的表达式。然而它不是一个函数调用表达式,所以你没有通过这样做调用任何函数。
(*callback)()
起作用是因为通过函数指针的间接寻址导致函数引用,您可以使用空参数列表调用该函数。 callback()
也可以工作,因为可以直接调用函数指针,在这种情况下,通过指针的间接寻址是隐式的。
实际上你可以写
callback();
如果您使用的是一元解引用运算符 *,则它的优先级低于后缀函数调用运算符。所以你必须写
(*callback)();
不然这样的调用
*callback();
编译器认为取消引用函数调用的结果。
请记住,您甚至可以编写如下内容
(******callback)();
因为生成的函数指示符被转换回函数指针。