我想知道我是如何编写一个函数,它返回一个指向函数的指针,该函数返回一个没有typedef的函数指针。例如,返回函数指针的函数可以定义为:
type (*f_name(..))(..){..}
所以这会返回一个指向函数的指针,该函数返回一个'类型',现在如果'键入'是一个函数指针。但由于我的主管不想使用typedef,我无法使用它们。
感谢您提供任何帮助。
答案 0 :(得分:7)
对于这样的问题,有一个名为cdecl
(http://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 ) ;