这个灾难性宣言的解释是否正确?

时间:2017-06-07 09:31:28

标签: c function function-pointers declaration

我刚开始一份新工作,我是唯一一个从事C项目的团队。所以我提出了这张照片:enter image description here

已经在旧工作地点装饰了我的桌子,我只是把解释视为合格。

把它放在我们办公室门的旁边的想法很受欢迎。当我被问到,如果我理解这是做什么以及我是否可以在今天晚些时候解释它,我同意并准备我的自我一点来解释它。

但是我被困了。忽略语义上已经错误的附加提示,我对2个空参数表达式列表的出现感到困惑。

这不是意味着,void (*(*f[])())()实际上是:f,标识一个未指定大小的数组,指向函数的指针,这些函数返回指向返回void的函数的指针?

或者我只是遗漏了一些东西,因为我的C技能可能有点生锈了?

1 个答案:

答案 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]()();
}