我如何在C中阅读这个复杂的声明?

Ami*_*mar 17 c

可能重复:
这段代码的含义是什么?void(*signal(int sig,void(*func)(int)))(int);

我有一个复杂的声明,它取自"signal.h"头文件,下面是声明.

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

现在,我该如何解析它?如

signal是带有两个参数'sig'的int类型和'func'的函数,它是一个指向函数的指针,该函数将int作为参数并返回void类型; 它返回一个指向函数的指针,该函数将int作为参数并返回void.

可以,或者信号是指向功能的指针吗?

Joh*_*ode 63

先从最左边的标识和工作的方式了,记住,[]()结合之前*,所以*a[]是一个指针数组,(*a)[]是一个指向数组的指针,*f()返回一个指针的函数,并且(*f)()是指向一个功能:

       signal                                     -- signal
       signal(                          )         -- is a function
       signal(    sig,                  )         -- with a parameter named sig
       signal(int sig,                  )         --   of type int
       signal(int sig,        func      )         -- and a parameter named func
       signal(int sig,      (*func)     )         --   which is a pointer
       signal(int sig,      (*func)(   ))         --   to a function
       signal(int sig,      (*func)(int))         --     taking an int parameter
       signal(int sig, void (*func)(int))         --     and returning void
      *signal(int sig, void (*func)(int))         -- returning a pointer
     (*signal(int sig, void (*func)(int)))(   )   -- to a function
     (*signal(int sig, void (*func)(int)))(int)   --   taking an int parameter
void (*signal(int sig, void (*func)(int)))(int);  --   and returning void
Run Code Online (Sandbox Code Playgroud)

signal将信号处理函数func与信号关联sig,并将指针返回到旧信号处理函数:

void new_interrupt_handler(int sig)
{
  ... // do something interesting with interrupt signal
}

int main(void)
{
  void (*old_interrupt_handler)(int);
  ...
  /**
   * Set up our new interrupt handler
   */
  old_interrupt_handler = signal(SIGINT, new_interrupt_handler);
  ...
  /**
   * Restore original interrupt handler
   */
  signal(SIGINT, old_interrupt_handler);
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • +1非常好,一步一步解释. (4认同)