首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C中阅读这个复杂的声明?

如何在C中阅读这个复杂的声明?
EN

Stack Overflow用户
提问于 2012-02-29 22:25:52
回答 5查看 1.9K关注 0票数 17

可能重复:

what's the meaning of this piece of code? void (*signal(int sig, void (*func)(int)))(int);

我有一个复杂的声明,它取自"signal.h“头文件,下面是声明。

代码语言:javascript
复制
  void (*signal(int sig, void (*func)(int)))(int);

现在,我该如何解析它呢?作为

信号是接受两个参数‘sig’和‘func’的函数,‘func’是一个指向以int作为参数并返回void类型的函数的指针;它返回一个指向以int作为参数并返回void类型的函数的指针。

是OK还是signal是指向函数的指针?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-29 22:38:50

从最左边的标识符开始,记住[]()*之前绑定,所以*a[]是一个指针数组,(*a)[]是指向数组的指针,*f()是返回指针的函数,(*f)()是指向函数的指针:

代码语言:javascript
复制
       signal                                     -- signal
       signal(                          )         -- is a function
       signal(    sig,                  )         -- with a parameter named sig
       signal(int sig,                  )         --   of type int
       signal(int sig,        func      )         -- and a parameter named func
       signal(int sig,      (*func)     )         --   which is a pointer
       signal(int sig,      (*func)(   ))         --   to a function
       signal(int sig,      (*func)(int))         --     taking an int parameter
       signal(int sig, void (*func)(int))         --     and returning void
      *signal(int sig, void (*func)(int))         -- returning a pointer
     (*signal(int sig, void (*func)(int)))(   )   -- to a function
     (*signal(int sig, void (*func)(int)))(int)   --   taking an int parameter
void (*signal(int sig, void (*func)(int)))(int);  --   and returning void

signal将信号处理程序函数func与信号sig关联,并返回指向旧信号处理程序函数的指针:

代码语言:javascript
复制
void new_interrupt_handler(int sig)
{
  ... // do something interesting with interrupt signal
}

int main(void)
{
  void (*old_interrupt_handler)(int);
  ...
  /**
   * Set up our new interrupt handler
   */
  old_interrupt_handler = signal(SIGINT, new_interrupt_handler);
  ...
  /**
   * Restore original interrupt handler
   */
  signal(SIGINT, old_interrupt_handler);
  ...
}
票数 63
EN

Stack Overflow用户

发布于 2012-02-29 22:33:07

使用cdecl.org,您可以获得

声明信号为函数(int,指向返回空的函数(int)的指针)返回指向返回空的函数(int)的指针

对于输入

代码语言:javascript
复制
void (*signal(int, void(*)(int)))(int)

这意味着signal是一个函数。调用signal的结果是指向函数void f(int)的指针。

解释:signal()调用安装一个新的信号处理程序并返回旧的信号处理程序(这样您可以在以后恢复它)。

票数 3
EN

Stack Overflow用户

发布于 2012-02-29 22:37:44

代码语言:javascript
复制
void (*signal(int, void (*)(int)))(int);  

       signal(                  )         // signal is a function
              int, void (*)(int)          // the parameter types of the function:
                                          //    an int and a function pointer (take int, return void)
void (*                          )(int);  // the return type of the function:
                                          //    a function pointer (take int, return void)

//参照John的回答进行编辑。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9500848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档