函数指针中是星号可选吗?

Sam*_*oat 5 c function

我正在使用的代码有这样的声明:

typedef void  ( udp_data_notify )(OS_FIFO * pfifo, WORD port); 
Run Code Online (Sandbox Code Playgroud)

这看起来像是udp_data_notify的函数指针声明,但是没有*.它仍然可以是没有星号的函数指针吗?

这是一个使用以下内容的声明udp_data_notify:

void RegisterUDPFifoWithNotify( WORD dp, OS_FIFO *pnewfifo , udp_data_notify * nudp)
Run Code Online (Sandbox Code Playgroud)

任何有关正在发生的事情的帮助将不胜感激!

rod*_*igo 6

一个 typedef,例如:

typedef void name(int);
Run Code Online (Sandbox Code Playgroud)

(周围的括号name是多余的)将定义name为函数的类型,而不是函数指针。那将是:

typedef void (*pname)(int);
Run Code Online (Sandbox Code Playgroud)

你可能想知道它们有什么用。好吧,函数类型不是很有用,除了用于声明指针:

name *pointer_to_function;
Run Code Online (Sandbox Code Playgroud)

使用其他 typedef 可以说更具可读性:

pname pointer_to_function;
Run Code Online (Sandbox Code Playgroud)

那是因为你不能定义函数类型的变量。如果你尝试,你将简单地编写一个函数的原型,但使用一种非常模糊的语法:

name foo;   //declaration (prototype), not variable
void foo(int x) //definition
{
}
Run Code Online (Sandbox Code Playgroud)

但请注意,您不能使用 typedef 来定义函数:

name foo {} //syntax error!
Run Code Online (Sandbox Code Playgroud)


Eri*_*hil 0

typedef您显示的声明是udp_data_notify函数类型的别名。然后参数声明udp_data_notify *nudp声明nudp为指向该类型的函数的指针。这里没有函数调用。

关于函数调用运算符(后缀()),指定被调用函数的表达式必须是指向函数的指针。当你正常调用一个没有指针的函数时,比如sqrt(2),函数会自动为你转换为指针。sqrt(2)其实也是如此(&sqrt)(2)。当您使用指针调用函数时,该调用已经采用了正确的形式。