【问题标题】:How can I read this C code? [duplicate]如何阅读此 C 代码? [复制]
【发布时间】:2015-08-19 15:51:37
【问题描述】:

我对 C 很陌生,无法成功理解以下代码:

#include <signal.h> //1
typedef void (*sighandler_t)(int); //2
sighandler_t signal (int signo, sighandler_t handler); //3

第 3 行是:

signal 是一个接受 2 个参数的函数,一个是整数,另一个是 sighandler_t 并返回一个 sighandler_t?

但是 sighandler_t 是什么?

它是一个指向函数的指针吗,被指向的函数是一个接受 int 类型参数并返回 void 的函数?

你能举例说明我如何使用它吗?

【问题讨论】:

  • signal() 这些天已经贬值了。 “man signal”说: signal() 的行为因 UNIX 版本而异,并且在历史上因 Linux 的不同版本而异。避免使用它:使用 sigaction(2) 代替。
  • @StarPilot 确实如此,从 16 年前开始。
  • gcc(至少)识别 C++ 风格的 cmets。它是 C。
  • 如果您打算在C 中使用函数指针,请考虑改用原始指针
  • @hacks,谢谢!我很感激!

标签: c


【解决方案1】:

线

typedef void (*sighandler_t)(int);  

定义一个新类型sighandler_t,它是指向一个函数的指针,该函数需要int 类型的参数并且什么都不返回

线

sighandler_t signal (int signo, sighandler_t handler);  

声明signal 一个函数,该函数需要int 类型的第一个参数和sighandler_t 类型的第二个参数并返回sighandler_t 类型。
sighandler_t 是用户定义的类型 最终指向一个函数的指针,该函数需要int 类型的参数并且不返回任何内容

如果没有typedef,它会写成

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

这更令人困惑。

【讨论】:

  • 我还是一头雾水。 sighandler_t 是在标准 C 中定义的,还是只是我正在阅读的书?
  • 为什么“信号”会返回一个“指向函数的指针”?
  • 感谢您的精彩回答,我唯一不明白的是,信号的返回值有什么用?
  • 返回值可用于调用sighandler_t类型的函数。
  • 那么像处理一个信号,然后运行不同的函数?
猜你喜欢
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2013-01-06
  • 2017-09-28
  • 2019-04-16
  • 2014-08-16
相关资源
最近更新 更多