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;
}
特别是,
- 为什么(1)中没有变量名?
void (*foo(void))
是什么意思? *foo(void)
怎么可能是名字?
return bar
是什么意思? Returns 它是 bar
源代码的地址,或者 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
的函数体不是要传递给参数的对象。
如果你能解释一下下面的意思,我将不胜感激:
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
是什么意思? Returns 它是bar
源代码的地址,或者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
的函数体不是要传递给参数的对象。