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

时间:2012-02-29 14:25:52

标签: c

  

可能重复:
  what's the meaning of this piece of code? void (*signal(int sig, void (*func)(int)))(int);

我有一个复杂的声明,它来自“signal.h”头文件,下面是声明。

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

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

  

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

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

5 个答案:

答案 0 :(得分:63)

从最左边的标识符开始,然后解决问题,记住[]之前()*绑定,*a[]是一个指针数组{{1}是一个指向数组的指针,(*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 将信号处理函数signal与信号func相关联,并返回指向旧信号处理函数的指针:

sig

答案 1 :(得分:3)

使用cdecl.org,即可获得

  

将signal声明为函数(int,指向函数的指针(int)返回void)返回指向function(int)的指针返回void

输入

void (*signal(int, void(*)(int)))(int)

这意味着signal是一个功能。调用signal的结果是指向函数void f(int)的指针。

说明:signal()调用会安装 new 信号处理程序并返回信号处理程序(因此,如果您愿意,可以稍后恢复)。

答案 2 :(得分:1)

signal是一个函数,它接受两个参数并返回一个指向函数的指针,该函数以int作为参数并返回void

signal所采用的两个参数是int和指向函数的指针,该函数将int作为参数并返回void

是的,你得到了描述和整体想法。

答案 3 :(得分:1)

不,这是对的。 signal接受2个参数,一个int和一个指向函数的指针,并返回一个指向函数的指针(与func参数具有相同的签名。)

它类似于(imo)更具可读性:

typedef void (*sig_func)(int);
sig_func signal(int sig, sig_func func);

答案 4 :(得分:0)

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

       signal(                  )         // signal is a function
              int, void (*)(int)          // the parameter types of the function:
                                          //    an int and a function pointer (take int, return void)
void (*                          )(int);  // the return type of the function:
                                          //    a function pointer (take int, return void)

//编辑引用John的答案。