我正在查看一些 80 年代后期的 C 代码。我有以下定义。
void (*_flush())(){ /* body ommitted */ }
我相信这是一个函数,_flush
,void
作为它的参数列表并返回一个函数指针,该指针返回void
并void
作为它的参数列表。
等价于两部分:
typedef void (*funcptr)(void);
functptr flush(void){ /* body ommitted */ }
我是否正确理解旧符号?
是的,您的理解(几乎)是正确的:
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 函数
使用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
.