为什么 (*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 只是取消对指针的引用,但对结果不做任何处理。语义上有效,但在此上下文中不执行任何操作。

另见 C++ Operator Precedence

why does (*callback)() work and not *callback() or *callback in c++

*callback() 不起作用,因为函数 returns voidvoid 表达式不能是操作数。

*callback "works" 在某种意义上它是一个格式正确的表达式。然而它不是一个函数调用表达式,所以你没有通过这样做调用任何函数。

(*callback)() 起作用是因为通过函数指针的间接寻址导致函数引用,您可以使用空参数列表调用该函数。 callback() 也可以工作,因为可以直接调用函数指针,在这种情况下,通过指针的间接寻址是隐式的。

实际上你可以写

callback();

如果您使用的是一元解引用运算符 *,则它的优先级低于后缀函数调用运算符。所以你必须写

(*callback)();

不然这样的调用

*callback();

编译器认为取消引用函数调用的结果。

请记住,您甚至可以编写如下内容

(******callback)();

因为生成的函数指示符被转换回函数指针。