2013-04-01 40 views
3

帮我理解下面的原型。 (int)在做什么?如何阅读这个原型?

void (*signal(int sig, void (*handler)(int))) (int); 
+1

退房[这个答案](http://stackoverflow.com/a/1591492/1383051)。它非常详细地回答你的问题! –

+0

可能的重复[了解C中函数指针的typedef:请参考示例,提示和技巧](http://stackoverflow.com/questions/1591361/understanding-typedefs-for-function-pointers-in-c-examples- hints-and-tips-ple) –

+0

@JimBalter,不太确定这是重复的。这个问题旨在理解函数指针'typedef's。这个问题旨在理解函数指针声明。这个问题的答案只是回答了这两个问题。但是,我可以理解,如果人们已经把答案作为答案来解决问题。 –

回答

0

void (*handler)(int);处理程序是指向函数(比如Fn1的)配有返回类型void和接受一个int

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

(*signal(int sig, Fn1);这个函数有返回类型void和接受一个intfunction pointer作为参数。

的返回类型此功能,它的指针是signal可能是一个函数的函数指针需要一个int [最后int]返回类型为void

8

整件事声明了一个名为signal功能:

  • signal采用int和一个函数指针
    • 此函数指针需要一个int并返回void
  • signal返回一个函数指针
    • 这个函数指针需要一个int,并返回一个void

这就是最后int进来。


您可以使用the spiral rule来理解这些声明或程序cdecl(1)

+1

+1来通知'cdecl'和[spiral rule](http://c-faq.com/decl/spiral.anderson.html)。看起来像一个很棒的工具 –

0

以上的原型现在可以写成::

typedef void (*sig_t) (int); 

sig_t signal(int sig, sig_t handler); 

,我希望这将是明确的给你。

0

它返回一个指向函数返回void..Source一个功能:在深度C秘密

+0

一个侧面说明:如果你读过_Deep C Secrets_,请记住,这本书是非常古老的,它的大部分咆哮都是无效的,即使在C89。 – Shahbaz

2

正如我在回答中指出,到最近的另一项问题“解读C声明”,一个办法理解这些声明是将参数列表和数组声明与左边的东西交换,然后向后读取声明。在这种情况下,让你

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

- >

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

其内容为“'信号是一个函数,它有两个参数,并返回一个指针,接受一个int参数,并返回void的函数”。这两个参数是一个int(sig)和一个指针(处理函数),它接受一个int参数并返回void。

或者你可以做精神交换,这与螺旋规则相同。

+0

很高兴我再次upvote这个答案:D –

4

找到最左边的标识符并找出您的出路,记住[]()*之前绑定; IOW,*a[]是指针数组,(*a)[]是指向数组的指针,*f()是返回指针的函数,而(*f)()是指向函数的指针。因此,

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

击穿作为

 signal           -- signal 
     signal(        )   -- is a function 
     signal( sig      )   -- with a parameter named sig 
     signal(int sig,      )   -- of type int 
     signal(int sig,  handler  )   -- and a parameter named handler 
     signal(int sig,  *handler  )   -- which is a pointer 
     signal(int sig,  (*handler)( )))   -- to a function 
     signal(int sig,  (*handler)(int)))   -- taking an int parameter 
     signal(int sig, void (*handler)(int)))   -- and returning void 
     *signal(int sig, void (*handler)(int)))   -- returning a pointer 
    (*signal(int sig, void (*handler)(int)))( ) -- to a function 
    (*signal(int sig, void (*handler)(int)))(int) -- taking an int parameter 
void (*signal(int sig, void (*handler)(int)))(int); -- and returning void 

signal功能关联与回调函数handler)的信号(sig),像这样:

#include <signal.h> 

static int interrupt = 0; 

/** 
* The following function will be called when a SIGINT is 
* detected (such as when someone types Ctrl-C) 
*/ 
void interrupt_handler(int sig) 
{ 
    interrupt = 1; 
} 

int main(void) 
{ 
    /** 
    * Declare a pointer to the old interrupt handler function 
    */ 
    void (*old_interrupt_handler)(int); 

    /** 
    * Save the old interrupt handler while setting the new one 
    */ 
    old_interrupt_handler = signal(SIGINT, interrupt_handler); 
    while (!interrupt) 
    { 
    // do stuff until someone hits Ctrl-C 
    }; 

    /** 
    * restore the original interrupt handler 
    */ 
    signal(SIGINT, old_interrupt_handler); 
    return 0; 
} 
+0

作为人们遇到这个答案的旁注:[你可能会'sigaction'而不是'signal'](http://stackoverflow.com/a/232711/ 912144)。 – Shahbaz