C 中未知的函数签名

Kir*_*ill 3 c pointers

如果您能向我解释以下含义,我将非常感激:

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)

尤其,

  • 为什么(1)中没有变量名?
  • 这是什么void (*foo(void))意思?怎么可以*foo(void)是名字呢?
  • 这是什么return bar意思?返回bar源代码的地址,或者 的结果bar,或者其他?
  • 是不是有什么特点让这些签名变得如此复杂呢?
  • 您能举个用法示例吗?

Tho*_*mas 5

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不是参数传递的对象。