void (*signal(int sig, void (*func)(int)))(int)
我不能太清楚地遵循这种语法解释。我知道这很简单,但我宁愿看一个快速的视频或读一本关于风格/软件工程概念的书。基本上我怎么能把它解释为编码器?
答案 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)
从另一方面看,你如何创建这样的声明?您可以遵循以下两条规则来实现:
T
的函数(带有一些参数列表),首先将func
声明为T
。然后在func
之后添加参数列表(括在括号中)。T
的指针,请先将ptr
声明为T
。然后在(*
之前添加)
,在ptr
之后添加(*ptr)
。 (可选)如果(
后面的令牌不是[
或*ptr
,您可以删除刚刚添加的令牌(仅留下func
)。(ptr
和signal
只是占位符。您可以使用任何您想要的标识符。)
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
本身所需要的,这是两个参数:
int
void
)返回int sig
#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
是一个函数(取int
,func
和int
,指向函数的指针void
并返回int
)返回指向void
并返回N
的函数的指针。
这个答案可能不会让你更容易阅读这些声明,但现在你将能够创建自己的这种怪物。 : - )
PS:如果你想要合并数组,还有第三条规则:
T
的数组(大小为arr
),请先将T
声明为[N]
。然后在arr
之后添加{{1}}。