请问这一句是什么意思?#define IO (void(*)(int)) -1

哟西哟西地 2004-11-08 11:56:49
请问这一句是什么意思?

#define IO (void(*)(int)) -1

这后面的-1有什么用?
...全文
284 点赞 收藏 20
写回复
20 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
哟西哟西地 2004-12-14
对不起,分太少了.:)
回复
哟西哟西地 2004-12-14
谢谢大家.

因为这段时我的ip被csdn给ban了.无法上来及时结贴,向大家说声对不起.!
回复
cdxiaogan 2004-11-13
怎么没人说了呢?高手快现身啊!
回复
harvey93 2004-11-13
说说我的理解,高手请指教:
#define IO (void(*)(int)) -1 /* IO定义为一个函数的指针(由-1转化来的),这个函数返回值为void型,参数为int,原因烧后说 */


void (*signal(int,void(*Func)(int)))(int);
/* 这个语句是对signal函数的一个声明.
假设作一个宏: #define POINTER signal(int,void(*Func)(int)) 那么原句可以写成为 void (* POINTER)(int); POINTER代表了一个函数指针,它是函数signal(int,void(*Func)(int))的返回值,函数signal(int,void(*Func)(int))本身有两个参数,一个为int型,另外一个参数又是一个函数的指针Func.因为signal返回值是void(* POINTER)(int)这种形式,所以如果-1要作为signal函数的返回值,就必须作一次强行转换,至于signal返回-1的含义,请见LoveCreatesBeauty(爱产生美)的大作
*/
回复
cdxiaogan 2004-11-10
to LoveCreatesBeauty(爱产生美):
/*************************

void ( *signal( int,void(*Func)(int) ) )(int);是这样一个函数:

1、它有两个参数。一个是int,一个是函数指针Func。
2、它的返回值是一个函数指针。在signal正确时它的返回值上一个函数的地址。这个用法可能与
Windows编程里有些概念相似,比如获取一个设备上下文句柄时,也会返回原始设备上下文的句
柄,以便恢复。
************************/
函数指针Func?Func是一个用typedefine定义过得自定义类型吗?
如果定义成void ( *signal( int,void(*)(int) ) )(int);会有什么区别呢?
回复
cdxiaogan 2004-11-10
to LoveCreatesBeauty(爱产生美):
/*************************

void ( *signal( int,void(*Func)(int) ) )(int);是这样一个函数:

1、它有两个参数。一个是int,一个是函数指针Func。
2、它的返回值是一个函数指针。在signal正确时它的返回值上一个函数的地址。这个用法可能与
Windows编程里有些概念相似,比如获取一个设备上下文句柄时,也会返回原始设备上下文的句
柄,以便恢复。
************************/
函数指针Func?Func是一个用typedefine定义过得自定义类型吗?
如果定义成void ( *signal( int,void(*)(int) ) )(int);会有什么区别呢?
回复
Zark 2004-11-09
根据不同的字长系统,这个宏可以变为

在16字长中
#define IO 0xFFFF

在32字长中
#define IO 0xFFFFFFFF
回复
把-1强制转化为(void(*)(int)),不会吧,这么暴力.
回复
zhangfjj 2004-11-09
在哪看到的?
单纯看的话,只是一个宏,不知道-1的作用。能不能给出更详细的代码?
回复
jozosoft 2004-11-09
哎,别光是嘴巴上说,送分给大家呀。我也要一点呀!
回复
得到您的表扬,真是比三伏天吃西瓜还要高兴:)
回复
Zark 2004-11-09
致: LoveCreatesBeauty(爱产生美)

正确.
回复
yycec 2004-11-09
这个宏定义了一个函数指针,指向函数的首地址-1处。
回复
//signal.h

/* signal error value (returned by signal call on error) */

#define SIG_ERR (void (__cdecl *)(int))-1 /* signal error value */


signal函数失败时返回SIG_ERR,在标准C语言中SIG_ERR是-1。但不能直接用-1。用为signal的返回类型是 void(*)(int)。所以-1也要转换为signal的返回类型。地址毕竟跟整数还是有区别的。这与DiabloWalkOnTheEarth(毁灭小符 (Annihilus)(99)(3502)) 猜得是一样的。不知道楼主提到的那个为什么没有用SIG_ERR,而是自定义一个类似的IO。金陵五月大哥指教一下:)




void ( *signal( int,void(*Func)(int) ) )(int);是这样一个函数:

1、它有两个参数。一个是int,一个是函数指针Func。
2、它的返回值是一个函数指针。在signal正确时它的返回值上一个函数的地址。这个用法可能与
Windows编程里有些概念相似,比如获取一个设备上下文句柄时,也会返回原始设备上下文的句
柄,以便恢复。
回复
hffaming 2004-11-09
void (*signal(int,void(*Func)(int)))(int);
该函数用来返回一个具有(int)参数的void函数句柄
回复
cdxiaogan 2004-11-09
计算机对(void(*)(int))的具体处理过程呢,请 Zark(金陵五月) 能进一步详细解释一下吗?
我初学者,谢谢!~
回复
sdusthd 2004-11-09
void (*signal(int,void(*Func)(int)))(int);

这个怎么理解?不理解为什么最后还有一个(int)?安它带入的参数好像不行呀
回复
sdusthd 2004-11-09
这个问题要关注
回复
哟西哟西地 2004-11-09
这是一本linux书中介绍的。
书中前面有定义:
void (*signal(int,void(*Func)(int)))(int);
#define IO (void(*)(int)) -1

void Text(int a){
..
}
后有
if(signal(10,text)==IO)
....

这样的语句。。。
回复
哟西哟西地 2004-11-08
在线=
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告