- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我遇到了这段代码并完全迷失了解释它的含义。
#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);
第2行代码的详细解释是什么?
我知道 void
和 int
是类型, *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/
我试图在字符串中显示 sig figs,我找到了 '{:.2f}'.format(x) 样式,只要我有sig figs 在代码中作为整数,但如果 sig figs 的数量包含在变量中,我似乎无法使这种
我创建的脚本有问题。这是我第一次使用信号,因为我希望我的脚本像守护进程一样运行,所以我设置了几个信号处理程序来正确结束我的脚本: local $SIG{HUP} = \&StopSuperviser;
我是 Alloy 新手,由于出现错误,我的程序无法执行或显示。我遇到的错误是 A Syntax error has occurred: You must specify a scope for "th
我在热门编码网站 codechef 上提交名为“Money Transformation”的问题时遇到问题。每次我提交解决方案时,我都会收到运行时错误名称 SIG SEGV。经过一些搜索在谷歌上我发现
Sorbet 显示 attr_reader 错误,但如果我错了请纠正我,当函数被声明而不是被调用时需要 sigs,对吧? 我已经尝试过阅读文档,但我得到的只是这个注释 注意:许多看起来像局部变量的 R
我们有一个关于 XML-sig 的问题,需要有关可选元素以及一些规范化和转换内容的详细信息。我们正在为一个非常小的 XML 语法负载编写规范,它将进入媒体文件的元数据,并且需要通过加密签名。我们认为我
我正在尝试在我的 Perl 程序中添加一个捕获信号。当 ctrl+C 发生时,我想要一条确认消息和一个用户输入( Y 或 N )。 Y 输入工作正常。 如果用户输入 N,那么基本上我想“取消” ctr
这个问题在这里已经有了答案: How does function application with the $ operator curry in Haskell? (1 个回答) 8年前关闭。 如果
这些设置之间有什么区别? $SIG{CHLD} = 'IGNORE' $SIG{CHLD} = 'DEFAULT' $SIG{CHLD} = '' $SIG{CHLD} = undef 根据“U
我有一段 Perl 代码,有点像下面这样(强烈简化): 有一些嵌套的子程序调用(实际上是方法),并且一些内部的执行它们自己的异常处理: sub outer { middle() } sub middl
最近尝试更新 emacs 软件包并得到了这个。 Failed to verify signature archive-contents.sig: No public key for 066DAFCB8
我正在使用带有grails安全性和JA-SIG CAS spring安全性插件的grails。 解决此问题的一种方法是登录到CAS服务器并重新启动应用程序。 另一种方法是,如果我通过同一CAS服务器登
因此,当我尝试传递对象 Map> 时,我的代码显示编译器错误到 Map> 的方法。如下... private static void logProgress(Map>> cacheLoaders, M
我创建了一个信号处理程序,以便在发送 SIGSEGV 时调用。我使用 C 语言编写程序,还使用 Linux 和 intel x86 处理器。在 sig 处理程序中,看起来通过 siginfo_t
我知道,通常你会告诉我检查日志(在崩溃之前,看看我是否遗漏了什么)。 .没什么,因为当我尝试开始一项新 Activity 时,应用程序无论如何都会崩溃。仅有的两个有效 Activity 是 Splas
我对如何正确关闭我正在使用的非常简单的服务器感到困惑。 我在想这应该够了: #!/usr/bin/python import signal import myhandler import Socket
我最近注意到,当使用 utf-8-sig 编码附加到文件时,Python 的行为方式并不明显。见下文: >>> import codecs, os >>> os.path.isfile('123')
我对shell 脚本编写 和Perl 很陌生,我正在尝试将Perl 脚本转换为Python脚本。 我遇到了下面的代码片段,但我并不清楚。 sub sigalrm_handler { printf
我正在构建一个使用蓝牙与远程传感器通信的 iPhone 应用程序。外设是蓝牙自行车速度传感器。该应用程序使用来自外围设备的信息来计算行驶距离。 我看到有一个蓝牙特别兴趣小组 (SIG) 负责确保制造商
我知道 .asc签名作为文本文件输出,而 .sig & .gpg是二进制的。 一边说: 是 .sig和 .gpg同一个文件有不同的扩展名?如果没有,为什么要使用一个? 文本文件和二进制文件,有什么相对
我是一名优秀的程序员,十分优秀!