在C语言中没有名称的函数指针

4

一个普通的函数指针看起来像这样:

void (*fun_ptr)(void);

不过,我曾经看到这种语法被用于将某些东西强制转换为一个void函数指针:

(void (*)(void *))

如您所见,它没有名称,只有(*)代替名称。这是什么意思?它仅用于转换吗?


不是的,那是将返回void和带有void *参数的函数转换成指针。你需要一个具有void *参数的函数,而不是一个没有名称的函数。 - Luis Colorado
3个回答

6

(void (*)(void *))语法是一个强制类型转换。

转换的目标类型是一个函数指针,它接受一个void *类型的参数,并返回void。一个符合此转换的函数类型的示例为:

void abc(void *param);

1
在C语言中,“类型名”(强制转换时的类型或sizeof的参数)与该类型的变量声明具有完全相同的形式,只是没有变量。而且变量的声明反映了它的用途。在您的情况下,一个接收void指针并返回void的函数指针被使用为
(*f)(p),
因此其声明为
void (*f)(void *P)
(请注意,p的嵌套类型声明!),相应的强制转换为
(void (*)(void *))。
这是一个简单、强大和合乎逻辑的原则;但一个后果是对于复杂的类型,变量名出现在声明中间,就像在相应的表达式中一样。
有趣的是,在类型名中只有一个变量名的位置(对于像您的函数中嵌套类型递归应用的情况)。类型名是无歧义的。

1
@exnihilo 谢谢你发现这个问题。我先用了一个更复杂的例子,然后改成了OP的,但并不完整。 - Peter - Reinstate Monica

1

void (*)(void *)是一种类型。它的概念类似于int *。它也没有与之关联的标识符。 void (*foo)(void *)是一个具有该类型的变量foo的声明。

强制转换表达式的形式为(<type>)<expr>。因此,(void (*)(void *))可以是一个强制转换运算符。

然而,这种形式不仅限于强制转换表达式。它可以在任何类型可用的地方使用。例如,在函数原型中作为参数的类型:

void bar(void (*)(void *));

这声明了一个函数bar,它接受一个函数指针作为参数。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接