void (*(*f[])())()
将f
定义为一个未指定大小的数组,该数组的指针指向返回void
的函数的指针。
用一个非常非常非常简单的解释这是什么意思
假设您有一个返回void的函数——我们称之为a()
。
a()
在内存中有一个地址
现在假设你有一个函数pa()
,它返回一个指向a()
的指针,即pa()
返回a()
的地址。
现在,你不是只有一对这样的函数,而是有几个:
-
b()
返回void,pb()
返回b()
的地址 -
c()
返回void,pc()
返回c()
的地址
等等
现在你想把pa()
, pb()
, pc()
等地址存储在一个数组中,但是你还不知道它们有多少,所以你声明了一个未指定大小的数组来保存所有这些地址。
该数组的类型是一个指向函数的指针数组,该函数返回指向返回void的函数的指针。
如果有疑问,则typedef:
typedef void (*f1)(); // pointer to function returning void
typedef f1 (*f2)(); // pointer to function returning f1
f2 f[]; // your array (not valid C!)
最终定义无效,因为f[]
是不完整类型,只允许定义完整类型的对象。不是定义的声明是可以的(extern f2 f[];
),或者您可以通过从带括号的初始化列表中暗示数组大小来获得完整类型,如f2 f[] = { a, b, c };
,在这种情况下,f
具有(完整)类型f2[3]
。
请注意,上面的typedef代码包含的开括号、闭括号、括号和星号的数量与你的声明相同。
我不知道它是否简单,但cdecl(1)
可以为您拆开:
cdecl> explain void (*(*f[])())();
声明f为指向返回void的函数的指针数组
(不使用代码格式,因为它引入了讨厌的水平滚动条和长描述行。)