c中未知的函数签名

  • 本文关键字:函数 未知 c pointers
  • 更新时间 :
  • 英文 :


如果您能解释一下下面的意思,我将非常感谢:

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

相关内容

  • 没有找到相关文章

最新更新