2

我正在查看一些 80 年代后期的 C 代码。我有以下定义。

void (*_flush())(){ /* body ommitted */ }

我相信这是一个函数,_flushvoid作为它的参数列表并返回一个函数指针,该指针返回voidvoid作为它的参数列表。

等价于两部分:

typedef void (*funcptr)(void);
functptr flush(void){  /* body ommitted */ }

我是否正确理解旧符号?

4

2 回答 2

2

是的,您的理解(几乎)是正确的:

cdecl> explain void (*_flush())()
declare _flush as function returning pointer to function returning void

但是,说您的函数具有void作为其参数列表是不正确的。像这样的功能:

void func()

不接受任何参数,它接受未指定数量的参数。您可以通过以下任何一种方式来调用它:

func()
func(a);
func(a, b, c);

等等。如果实现_flush使用任何参数,您可能可以void按照您的建议安全使用,但您的示例没有包含足够的信息来说明。

一个很好的参考:无参数行为的 C 函数

于 2013-08-28T00:17:36.577 回答
0

使用http://www.cdecl.org/来获得你的函数的一个很好的翻译。

void (*_flush())()
declare _flush as function returning pointer to function returning void

如果函数的定义_flush()本身使用了任何参数,它们将被列在最后一个之间){因此我们可以确信该函数_flush不接受任何参数。

void (*_flush())() { /* body omitted */ }
//----------------^

的返回值flush本身就是一个函数,我们称之为foo

void foo(...)
declare foo as function returning void

这里知道函数返回void,但它的参数列表可以是任意数量的参数和任意数量的任何类型。只是从给出的信息中不知道,但可能从_flush.

于 2013-08-28T02:16:08.903 回答