我刚开始一份新工作,我是唯一一个从事C项目的团队。所以我提出了这张照片:
已经在旧工作地点装饰了我的桌子,我只是把解释视为合格。
把它放在我们办公室门的旁边的想法很受欢迎。当我被问到,如果我理解这是做什么以及我是否可以在今天晚些时候解释它,我同意并准备我的自我一点来解释它。
但是我被困了。忽略语义上已经错误的附加提示,我对2个空参数表达式列表的出现感到困惑。这不是意味着,void (*(*f[])())()
实际上是:f
,标识一个未指定大小的数组,指向函数的指针,这些函数返回指向返回void的函数的指针?
或者我只是遗漏了一些东西,因为我的C技能可能有点生锈了?
答案 0 :(得分:4)
对于C语言的初学者来说,像
这样的函数声明void f();
表示根据函数调用定义参数的数量和类型。
来自C标准(6.7.6.3函数声明符(包括原型))
14标识符列表仅声明参数的标识符 功能。函数声明符中的空列表 该函数的定义指定该函数没有 参数。 函数声明符中不属于的空列表 该函数的定义指定没有关于的信息 提供参数的数量
因此,如果函数没有参数,最好写
void f( void );
尽管为了清晰起见并不重要,但我们要重写声明
void(*(*f[])( ))( )
像
void(*(*f[])( void ))( void )
此声明声明了一个未指定大小的数组(数组的大小由初始化器的数量确定)指向函数的指针。函数没有参数,并返回指向函数的指针,而函数又没有参数,返回类型为void。
这是一个示范程序
#include <stdio.h>
void func2(void)
{
puts("Hello C");
}
void(*(func1)( void ))( void )
{
return func2;
}
int main( void )
{
void(*(*f[])( void ))( void) = { func1 };
f[0]()();
}
void(*(*f[])())()
它的输出是
Hello C
通过引入typedef可以简化声明。
例如
#include <stdio.h>
void func2(void)
{
puts("Hello C");
}
typedef void(*FP)(void);
FP func1(void)
{
return func2;
}
int main( void )
{
FP ( *f[] )( void ) = { func1 };
f[0]()();
}