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

How do I declare a function that returns a pointer to a function that returns a function pointer without using a typedef in C?

我想知道如何编写一个函数,其中 returns 一个指向函数的指针, returns 一个函数指针,没有 typedef。例如一个函数,其中returns一个函数指针可以定义为:

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

所以这个 returns 一个指向 returns 一个 'type' 的函数的指针,现在如果 'type' 是一个函数指针,你如何声明这个函数。但是由于我的主管不想使用 typedef,所以我不能使用它们。

感谢您提供的任何帮助。

对于这样的问题,有一个名为 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)

给予

declare g as function (float) returning pointer to function (double, double) returning pointer to function (char) returning int

首先我们编写一个函数,接受一个 int 并返回一个 float。

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

然后我们编写一个函数,它什么都不带,返回一个指针,指向一个带 int 并返回 float 的函数。
这个指针与 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 ) ;