gpt4 book ai didi

c - 这段代码是什么意思? void (*signal(int sig, void (*func)(int)))(int);

转载 作者:太空狗 更新时间:2023-10-29 16:21:44 34 4
gpt4 key购买 nike

我遇到了这段代码并完全迷失了解释它的含义。

#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);

第2行代码的详细解释是什么?

我知道 voidint 是类型, *func 是函数指针,括号是优先级。但我仍然没有得到 (*signal ...)、(int) 和整个组合在一起的东西。越详细越好。

可能我已经知道这个声明的含义/效果。但我必须进行更多试验以帮助我了解发生了什么,如下所示:

  1 #include <signal.h>
2 void (*signal)(int sig, void (*func)(int));
3 void (*signal)(int); // then void (signal)(int) again.
4 //void (*signal(int sig, void (*func)(int)))(int); //break this line into two lines above
5
6 int main(){}

在上面的代码中,我将 void (*signal(int sig, void (*func)(int)))(int) 分成两行。对于第 3 行,我同时尝试了 void (*signal)(int)void (signal)(int),结果相同,表明我正在尝试重新声明信号:

TestDeclaration.c:2: error: 'signal' redeclared as different kind of symbol /usr/include/signal.h:93: error: previous declaration of 'signal' was here
TestDeclaration.c:3: error: 'signal' redeclared as different kind of symbol /usr/include/signal.h:93: error: previous declaration of 'signal' was here

现在我知道这两种试验都是不正确的申报方式,但为什么不正确呢?为什么原来的申报方式不是重新申报?

最佳答案

这是一个函数的声明,它接受一个 int 和一个指向函数的指针(接受 int 返回 void)并返回一个指向函数的指针(接受 int 并返回 void)。


解释或解释指南

您可以通过将括号中的所有内容视为单个实体来进行解释,然后使用“声明遵循用法”规则向内工作。

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

括号中的实体看起来像一个接受int 并返回void 的函数。

剥去外面的部分:

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

因此,signal 接受一些参数并返回一些可以取消引用的东西(由于前导 *)以形成一个采用 int 的函数并返回 void

这意味着 signal 是一个返回函数指针的函数(采用 int 并返回 void)。

查看参数,它采用 int(即 sig)和 void (*func)(int),它是指向一个函数(获取 int 并返回 void)。

关于c - 这段代码是什么意思? void (*signal(int sig, void (*func)(int)))(int);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3706704/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com