回答
void (*handler)(int);
处理程序是指向函数(比如Fn1的)配有返回类型void
和接受一个int
void (*signal(int sig, Fn1)) (int);
(*signal(int sig, Fn1);
这个函数有返回类型void
和接受一个int
和function pointer
作为参数。
的返回类型此功能,它的指针是signal
可能是一个函数的函数指针需要一个int
[最后int
]返回类型为void
整件事声明了一个名为signal
功能:
signal
采用int和一个函数指针- 此函数指针需要一个
int
并返回void
- 此函数指针需要一个
signal
返回一个函数指针- 这个函数指针需要一个
int
,并返回一个void
- 这个函数指针需要一个
这就是最后int
进来。
您可以使用the spiral rule来理解这些声明或程序cdecl(1)
。
+1来通知'cdecl'和[spiral rule](http://c-faq.com/decl/spiral.anderson.html)。看起来像一个很棒的工具 –
以上的原型现在可以写成::
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t handler);
,我希望这将是明确的给你。
它返回一个指向函数返回void..Source一个功能:在深度C秘密
一个侧面说明:如果你读过_Deep C Secrets_,请记住,这本书是非常古老的,它的大部分咆哮都是无效的,即使在C89。 – Shahbaz
正如我在回答中指出,到最近的另一项问题“解读C声明”,一个办法理解这些声明是将参数列表和数组声明与左边的东西交换,然后向后读取声明。在这种情况下,让你
void (*signal(int sig, void (*handler)(int))) (int)
- >
void (int)(*(int sig, void (int)(*handler))signal)
其内容为“'信号是一个函数,它有两个参数,并返回一个指针,接受一个int参数,并返回void的函数”。这两个参数是一个int(sig)和一个指针(处理函数),它接受一个int参数并返回void。
或者你可以做精神交换,这与螺旋规则相同。
很高兴我再次upvote这个答案:D –
找到最左边的标识符并找出您的出路,记住[]
和()
在*
之前绑定; 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;
}
作为人们遇到这个答案的旁注:[你可能会'sigaction'而不是'signal'](http://stackoverflow.com/a/232711/ 912144)。 – Shahbaz
- 1. 如何阅读这个JSON
- 2. 如何阅读这个JSON?
- 3. 如何阅读这个简单的json?
- 4. 如何阅读这个崩溃日志?
- 5. 我如何阅读这个XML文档?
- 6. 我如何阅读这个XML部分?
- 7. 如何阅读这个LESS css?
- 8. 如何阅读这个JavaScript语句
- 9. 如何阅读这个Swift语法?
- 10. 我如何阅读这个JSON?
- 11. 如何阅读这个JSON字符串?
- 12. 我如何阅读这个XML?
- 13. 你如何阅读这个json数组?
- 14. 阅读bootsector还原
- 15. 如何读取原型
- 16. 我如何阅读这些json数据?
- 17. 如何阅读这行代码
- 18. 如何阅读这一小段XML?
- 19. 如何阅读这些json文件
- 20. 如何阅读这样的建筑?
- 21. 如何阅读这种XML使用PHP
- 22. 原子阅读与QAtomicInt/QAtomicPointer
- 23. 阅读原始文件C++
- 24. 原型这个选择
- 25. “这个”不使用原型
- 26. 这个vs原型Javascript
- 27. javascript原型vs这个
- 28. 如何阅读和理解怪物例外(例如这一个)
- 29. 如何阅读
- 30. 如何阅读?
退房[这个答案](http://stackoverflow.com/a/1591492/1383051)。它非常详细地回答你的问题! –
可能的重复[了解C中函数指针的typedef:请参考示例,提示和技巧](http://stackoverflow.com/questions/1591361/understanding-typedefs-for-function-pointers-in-c-examples- hints-and-tips-ple) –
@JimBalter,不太确定这是重复的。这个问题旨在理解函数指针'typedef's。这个问题旨在理解函数指针声明。这个问题的答案只是回答了这两个问题。但是,我可以理解,如果人们已经把答案作为答案来解决问题。 –