我正在使用的代码有这样的声明:
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)
任何有关正在发生的事情的帮助将不胜感激!
一个 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)
typedef您显示的声明是udp_data_notify函数类型的别名。然后参数声明udp_data_notify *nudp声明nudp为指向该类型的函数的指针。这里没有函数调用。
关于函数调用运算符(后缀()),指定被调用函数的表达式必须是指向函数的指针。当你正常调用一个没有指针的函数时,比如sqrt(2),函数会自动为你转换为指针。sqrt(2)其实也是如此(&sqrt)(2)。当您使用指针调用函数时,该调用已经采用了正确的形式。