如何阅读这个原型?

时间:2013-04-01 07:35:22

标签: c function-pointers

帮助我理解以下原型。最后(int)做了什么?

void ( *signal(int sig, void (*handler)(int)) ) (int);

6 个答案:

答案 0 :(得分:8)

整个事情声明了一个名为signal的函数:

  • signal接受一个int和一个函数指针
    • 此函数指针采用int并返回void
  • signal返回一个函数指针
    • 此函数指针采用int 并返回void

这就是最后int进来的地方。


您可以使用the spiral rule来理解此类声明或程序cdecl(1)

答案 1 :(得分:5)

找到最左边的标识符并逐步解决,记住在[]之前()*绑定; IOW,*a[]是指针数组,(*a)[]是指向数组的指针,*f()是返回指针的函数,(*f)()是指向函数的指针。因此,

void ( *signal(int sig, void (*handler)(int)) ) (int);

分解为

        signal                                          -- signal
        signal(                               )         -- is a function
        signal(    sig                        )         -- with a parameter named sig
        signal(int sig,                       )         --   of type int
        signal(int sig,        handler        )         -- and a parameter named handler
        signal(int sig,       *handler        )         --   which is a pointer
        signal(int sig,      (*handler)(   )) )         --   to a function
        signal(int sig,      (*handler)(int)) )         --   taking an int parameter
        signal(int sig, void (*handler)(int)) )         --   and returning void
       *signal(int sig, void (*handler)(int)) )         -- returning a pointer
     ( *signal(int sig, void (*handler)(int)) )(   )    -- to a function
     ( *signal(int sig, void (*handler)(int)) )(int)    --   taking an int parameter
void ( *signal(int sig, void (*handler)(int)) )(int);   --   and returning void

signal函数将信号(sig)与回调函数handler)相关联,如下所示:

#include <signal.h>

static int interrupt = 0;

/**
 * The following function will be called when a SIGINT is
 * detected (such as when someone types Ctrl-C)
 */
void interrupt_handler( int sig )
{
  interrupt = 1;
}

int main( void )
{
  /**
   * Declare a pointer to the old interrupt handler function
   */
  void (*old_interrupt_handler )(int);

  /**
   * Save the old interrupt handler while setting the new one
   */
  old_interrupt_handler = signal( SIGINT, interrupt_handler );
  while ( !interrupt )
  {
    // do stuff until someone hits Ctrl-C
  };

  /**
   * restore the original interrupt handler
   */
  signal( SIGINT, old_interrupt_handler );
  return 0;
}

答案 2 :(得分:2)

正如我在回答另一个最近的问题时所指出的,理解这些声明的一种方法是将参数列表和数组声明符与左边的东西交换,然后向后读取声明。在这种情况下,给你

void ( *signal(int sig, void (*handler)(int)) ) (int)

- &GT;

void (int)( *(int sig, void (int)(*handler))signal )

其中读取为“`signal是一个函数,它接受两个参数并返回一个指向函数的指针,该函数接受一个int参数并返回void”。这两个参数是int(sig)和一个函数的指针(处理程序),该函数接受一个int参数并返回void。

或者你可以在心理上进行交换,这与螺旋规则相同。

答案 3 :(得分:0)

void (*handler)(int); handler是指向函数(比如Fn1)的指针,返回类型为void并且需要int

void (*signal(int sig, Fn1)) (int);

(*signal(int sig, Fn1);此函数的返回类型为void,并以intfunction pointer作为参数。

此函数的返回类型(其指针为signal)可能是一个函数的函数指针,该函数采用返回类型为int的{​​{1}} [final int]

答案 4 :(得分:0)

上述原型可以写成::

typedef void (*sig_t) (int);

sig_t signal(int sig, sig_t handler);

现在,我希望你能清楚。

答案 5 :(得分:0)

它是一个函数,返回一个指向函数的指针返回void..Source:“解密C声明”在DEEP C SECRETS中