C 中的未知函数签名

Unknown function signature in C

如果你能解释一下下面的意思,我将不胜感激:

void bar(char *a, char *b, unsigned short c)      // (2)
{
    ...
}

void (*foo(void))(char *, char *, unsigned short) // (1)
{
    return bar;
}

特别是,

foo 是一个不带参数的函数,return 是一个 指向函数 的指针,它带有三个 char * 类型的参数, char *unsigned short 和 returns void.

这些声明可能会非常混乱,因为它们应该被阅读 inside-out,根据需要左右弹跳:

  • foo是个东西...
  • foo(void) ...显然是一个函数
  • *foo(void) ... 其 return 值可以取消引用
  • (*foo(void))(...) ...然后用这些参数调用
  • void (*foo(void))(...) ... 产生 void.
  • 类型的值

您还可以使用cdecl.org为您解析复杂的声明:

declare foo as function (void) returning pointer to function (pointer to char, pointer to char, unsigned short) returning 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 的函数体不是要传递给参数的对象。