4

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

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

6 回答 6

9

找到最左边的标识符并找出路,记住它[]()在之前绑定*;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;
}
于 2013-04-01T11:35:17.123 回答
9

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

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

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


您可以使用螺旋规则来理解此类声明或程序cdecl(1)

于 2013-04-01T07:41:14.493 回答
2

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

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

->

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

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

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

于 2013-04-01T09:39:03.577 回答
0

它是一个返回指向返回 void 的函数的指针的函数。来源:DEEP C SECRETS 中的“Unscrambling C Declarations”

于 2013-04-01T08:47:06.990 回答
0

void (*handler)(int);handler 是指向具有返回类型的函数(例如 Fn1)的指针,void并接受int

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

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

这个函数的返回类型,它的指针signal可能是一个函数指针,它接受一个返回类型为int[final int]的函数void

于 2013-04-01T07:40:41.807 回答
0

上面的原型可以写成:

typedef void (*sig_t) (int);

sig_t signal(int sig, sig_t handler);

现在,我希望你会清楚。

于 2013-04-01T07:52:39.430 回答