如何在不使用C中的typedef的情况下声明一个返回指向函数的函数的函数,该函数返回函数指针?

时间:2015-04-22 08:19:22

标签: c return-value function-pointers return-type

我想知道我是如何编写一个函数,它返回一个指向函数的指针,该函数返回一个没有typedef的函数指针。例如,返回函数指针的函数可以定义为:

type (*f_name(..))(..){..}

所以这会返回一个指向函数的指针,该函数返回一个'类型',现在如果'键入'是一个函数指针。但由于我的主管不想使用typedef,我无法使用它们。

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:7)

对于这样的问题,有一个名为cdeclhttp://cdecl.org/)的漂亮工具,可以在英语和C声明之间进行翻译。

例如

cdecl> declare f as function (int) returning pointer to function (char) returning pointer to function (void) returning long

给出答案

long (*(*f(int ))(char ))(void )

,在另一个方向,

cdecl> explain int (*(*g(float))(double, double))(char)

给出

  

声明g为函数(float)返回指向函数的指针(double,   double)返回指向函数(char)的指针返回int

答案 1 :(得分:3)

首先我们编写一个带int的函数并返回一个float。

float First( int f )
{
    return ( float )f ;
}

然后我们编写一个不带任何东西的函数,并返回一个指向函数的指针,该函数接受一个int并返回一个浮点数。
这个指针与First的类型相同。

float ( *Second( void ) )( int ) 
{
    float (*f)( int ) = First ;

return f ;
}

最后,我们编写了一个函数,它接受一个char并返回一个函数的指针,该函数不执行任何操作,并返回指向函数的指针,该函数接受一个int并返回一个float。该指针与Second的类型相同。

float ( *( *Third( char c ) )( void ) )( int )
{
    ( void )c ;
    float ( *(*s)( void ) )( int ) = Second ;

return s ;
}

如果你把原型放在一起,那么奇怪的语法就会有意义:

float       First                    ( int ) ;
float (    *Second         ( void ) )( int ) ;
float ( *( *Third( char ) )( void ) )( int ) ;

返回非函数指针的唯一区别是函数指针参数位于声明的末尾,括号:

         type*  Name( void ) ; 
function_type (*Name( void ) )( int ) ;