6

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

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)

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

4

3 回答 3

6

一个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!
于 2013-07-28T23:48:40.737 回答
4

如前所述,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
}
于 2013-07-29T01:00:47.170 回答
0

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

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

于 2013-07-28T23:41:53.883 回答