为什么在这个信号声明中有一个指向什么的指针?

时间:2017-03-25 08:42:59

标签: c++ c

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

我不能太清楚地遵循这种语法解释。我知道这很简单,但我宁愿看一个快速的视频或读一本关于风格/软件工程概念的书。基本上我怎么能把它解释为编码器?

4 个答案:

答案 0 :(得分:3)

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

signal是一个函数,它接受int和一个指向函数的指针(以整数作为参数并返回void)并返回指向函数的指针(以整数作为参数并返回void)

参考链接:https://www.tutorialspoint.com/c_standard_library/c_function_signal.htm

答案 1 :(得分:1)

func 是一个函数指针,它将int作为参数并且不返回任何内容。

void (*func)(int)

Signal是一个函数,它为 int func 提供参数:

signal(int sig, void (*func)(int)) // calling it x

Signal从上面的表单中返回一个函数指针,将int作为参数并且不返回任何内容:

void (*x)(int)

答案 2 :(得分:0)

对我来说,我喜欢从内到外解释它。

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

首先你需要知道函数指针的语法,当你看到void (*func)(int)时,你应该知道这是一个函数指针,它可以指向以int作为参数的函数。

然后是第二部分void (*signal(int sig, ...))(int),你可以看到有signal的调用,还有函数指针的语法。因此,signal是一个返回函数指针的函数,因此它可以与函数指针语法void (*signal(..))(int)协调

PS。我想你可以learn about how to use typedef with function pointer

答案 3 :(得分:0)

从另一方面看,你如何创建这样的声明?您可以遵循以下两条规则来实现:

  1. 要声明返回T的函数(带有一些参数列表),首先将func声明为T。然后在func之后添加参数列表(括在括号中)。
  2. 要声明指向T的指针,请先将ptr声明为T。然后在(*之前添加),在ptr之后添加(*ptr)。 (可选)如果(后面的令牌不是[*ptr,您可以删除刚刚添加的令牌(仅留下func)。
  3. ptrsignal只是占位符。您可以使用任何您想要的标识符。)

    void是一个函数(稍后我们将处理这些参数),返回指向返回signal的函数(某些参数)的指针。要声明这一点,我们需要从最后开始并将void声明为void signal; (是的,我知道这是不允许的):

    void

    下一步是“...函数(某些参数)返回void signal( /* some parameters */ ); ”,因此我们应用规则#1:

    void (*signal)( /* some parameters */ );
    

    下一步是“...指向[该功能]的指针”,因此我们应用规则#2:

    (*signal)

    我们无法删除(中的parens,因为以下标记为void (*signal( /* to be dealt with later */ ))( /* some parameters */ );

    下一步是“......一个函数(稍后我们将处理参数)返回[指针]”,所以我们应用规则#1:

    signal

    这是完整的骨架。现在让我们看一下参数列表。

    一些参数部分是函数 - int - 返回指针接受的内容。这只是一个void (*signal( /* to be dealt with later */ ))( int );

    signal

    稍后要处理的 部分是int本身所需要的,这是两个参数:

    1. 信号编号int
    2. 信号处理程序,指向函数的指针(带void)返回int sig
    3. #1很简单:void func; // func is void

      #2可以再次“向后”完成:

      void func(int);  // func is a function returning void
      

      应用规则#1:

      void (*func)(int);  // func is a pointer to a function returning void
      

      应用规则#2:

      signal

      void (*signal( int sig, void (*func)(int) ))( int ); 的声明中插入我们的参数最终给了我们:

      signal

      这正是您难以解读的声明:sig是一个函数(取intfuncint,指向函数的指针void并返回int)返回指向void并返回N的函数的指针。

      这个答案可能不会让你更容易阅读这些声明,但现在你将能够创建自己的这种怪物。 : - )

      PS:如果你想要合并数组,还有第三条规则:

      1. 要声明T的数组(大小为arr),请先将T声明为[N]。然后在arr之后添加{{1}}。