如何阅读这个原型?

Sea*_*oob 3 c prototype function-pointers declaration

帮助我理解以下原型.最后一次(int)做什么?

void ( *signal(int sig, void (*handler)(int)) ) (int);
Run Code Online (Sandbox Code Playgroud)

cni*_*tar 8

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

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

这就是最后一次int进入的地方.


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


Joh*_*ode 6

找到最左边的标识符,然后走出去,记住它[]()在它之前绑定*;IOW *a[]是一个指针数组,(*a)[]是一个指向数组的指针,是一个*f()返回指针的函数,并且(*f)()是一个指向函数的指针。从而,

void ( *signal(int sig, void (*handler)(int)) ) (int);
Run Code Online (Sandbox Code Playgroud)

分解为

        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
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)