如果您能解释一下下面的意思,我将非常感谢:
void bar(char *a, char *b, unsigned short c) // (2)
{
...
}
void (*foo(void))(char *, char *, unsigned short) // (1)
{
return bar;
}
特别是
- 为什么在(1)中没有变量名?
void (*foo(void))
是什么意思?*foo(void)
怎么会是一个名字呢?return bar
是什么意思?返回bar
源代码的地址,或bar
的结果,或其他?- 有什么特点使这些签名如此复杂吗?
- 你能举个例子吗?
foo
是一个不带参数的函数,它返回一个指针,该指针指向一个接受char *
、char *
和unsigned short
三个类型参数并返回void
的函数。
这些声明可能会让人很困惑,因为它们应该从内到外读,根据需要左右跳动:
foo
是一个东西foo(void)
…显然是一个函数*foo(void)
…返回值可以被解引用(*foo(void))(...)
…然后用以下参数调用void (*foo(void))(...)
…其结果是void
类型的值。
你也可以使用cdecl.org为你解析复杂的声明:
声明foo为函数(void)返回指向函数的指针(指向char的指针,指向char的指针,unsigned short)返回void
用法示例:
// Immediately call the returned function.
// The similarity to the declaration is no coincidence!
(*foo())("hello", "world", 42);
// Store the returned function pointer for later invocation.
// This time there are no parentheses following the name, because
// this is a variable, not a function.
void (*fnPtr)(char *, char *, unsigned short) = foo();
(*fnPtr)("hello", "world", 42);
如果实参不在函数内部使用,
实参名总是可以省略的。在这种情况下,甚至没有一个函数体来使用它们,因为foo
的函数体不是参数传递给的对象。