我使用的代码有这样的陈述:
typedef void ( udp_data_notify )(OS_FIFO * pfifo, WORD port);
这看起来像是udp_data_notify的函数指针的声明,但是没有*
。它仍然可以是没有星号的函数指针吗?
以下是使用udp_data_notify
的声明:
void RegisterUDPFifoWithNotify( WORD dp, OS_FIFO *pnewfifo , udp_data_notify * nudp)
任何有关正在发生的事情的帮助都将不胜感激!
答案 0 :(得分:4)
typedef,例如:
typedef void name(int);
(name
周围的括号是冗余的)将name
定义为函数的类型,而不是函数指针。那将是:
typedef void (*pname)(int);
你可能想知道它们有什么用处。好吧,除了声明指针之外,函数类型不是很有用:
name *pointer_to_function;
使用其他typedef可以说这更具可读性:
pname pointer_to_function;
那是因为你无法定义类型函数的变量。如果你尝试,你只需编写一个函数的原型,但语法相当混淆:
name foo; //declaration (prototype), not variable
void foo(int x) //definition
{
}
但请注意,您无法使用typedef来定义函数:
name foo {} //syntax error!
答案 1 :(得分:3)
如前所述,typedef声明了函数类型的别名。如果要使用它来声明函数指针,则需要星号(udp_data_notify* x
)。没有星号(udp_data_notify x
)的声明将是一个函数声明,除了一个特殊情况。在参数中使用时,函数类型会自动转换为相应的函数指针类型:
typedef void F(void);
void foo(F a, F* b) // special case; a and b are both function pointers
{
F c; // function declaration
F* d; // function pointer
}
答案 2 :(得分:0)
您展示的typedef
声明udp_data_notify
是函数类型的别名。然后参数声明udp_data_notify *nudp
声明nudp
是指向该类型函数的指针。这里没有函数调用。
关于函数调用运算符(postfix ()
),指定被调用函数的表达式必须是指向函数的指针。当您正常调用函数而没有指针(例如sqrt(2)
)时,该函数会自动转换为指针。所以sqrt(2)
实际上是(&sqrt)(2)
。当您使用指针调用函数时,调用已经是正确的形式。