如果您能向我解释以下含义,我将非常感激:
void bar(char *a, char *b, unsigned short c) // (2)
{
...
}
void (*foo(void))(char *, char *, unsigned short) // (1)
{
return bar;
}
Run Code Online (Sandbox Code Playgroud)
尤其,
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 的指针、无符号短整型)返回 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);
Run Code Online (Sandbox Code Playgroud)
如果函数内未使用参数,则始终可以省略参数名称。在这种情况下,甚至没有可以使用它们的函数体,因为函数体foo不是参数传递的对象。