#define SIG_IGN语法问题
void(*signal(int sig,void(*disp)(int)))(int);
#define SIG_IGN (void(*)()) 1
void(*)()定义了一个指向函数的空指针,这个空指针后面加个常数又会是怎么回事?是函数的参数?SIG_IGN又可做为参数传入signal中,真是被搞得晕部转向,请大家帮忙解释一下。
问题点数:20、回复次数:11Top
1 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-04 08:13:18 得分 0
void(*)()不是定义一个指向函数的空指针,而是定义了一个函数指针,这个指针所指向的函数的返回值为空。
我觉得#define SIG_IGN (void(*)()) 1应该是打印错了个1,在楼主那边能通过编译吗?楼主用了什么编译器?至少在我这里是编译不通过的。
Top
2 楼jixingzhong(瞌睡虫·星辰)回复于 2005-08-04 08:26:54 得分 0
#define SIG_IGN (void(*)()) 1
void(*)()定义了一个指向函数的空指针,这个空指针后面加个常数又会是怎么回事?是函数的参数?
楼主理解有误
定义的是一个函数指针
void 是返回类型 不是函数类型
另外, 后面的常数 应该是印刷问题
在语法上不能通过这样的定义Top
3 楼luyanfei78(漠漠轻寒)回复于 2005-08-04 08:57:12 得分 0
《UNIX进程间通信》第82-83页,signal函数是一个系统调用,定义如上所述,返加的是一个函数指针,然后就是定义了下面这几个宏:
#define SIG_DEL (void(*) ()) 0
#define SIG_ERR (void(*) ()) -1
#define SIG_IGN (void(*) ()) 1
#define SIG_HOLD (void(*) ()) 2
调用signal函数时是这样调用的
if(signal(SIGHUP,SIG_IGN)==SIG_ERR)...
不会是印刷错误的。Top
4 楼OpenHero(开勇)回复于 2005-08-04 09:18:41 得分 5
那是不是这个解释哪?
#define SIG_IGN (void(*) ()) 1
定义SIG_IGN 为 1 但是这个1 是(void(*) ())型的Top
5 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-04 09:34:50 得分 10
(void(*)())和1之间有空格吗?也有可能原书在两者之间多打印了一个空格,如果是(void(*)())1这样是解释得通的,这样就是把1强制转换为指向返回值为空的函数的地址。
如果两者间真的有空格的话,那就要看unix的编译器是如何处理这个空格的,有可能是把这个空格忽略掉。至少在windows下,如下代码是通不过编译的:
#define sign 56 1
int i;
i=sign;
编译的时候马上就出错了。
Top
6 楼luyanfei78(漠漠轻寒)回复于 2005-08-04 09:39:10 得分 0
楼上这位朋友应该是理解对的,书上也讲这些宏是叙谈整数值定义的,我当时一直没搞明白这句话,当是瞎扯。把了个函数指针定义成1,是一个无效的地址。看来C语言真是复杂,本以为不过那么点语法,现在才知这么点语法也能变出些你不认识的花样来。谢谢了。帖子留会儿再结掉。Top
7 楼luyanfei78(漠漠轻寒)回复于 2005-08-04 09:39:53 得分 0
有空格的Top
8 楼luyanfei78(漠漠轻寒)回复于 2005-08-04 09:42:25 得分 0
有没有空格应该关系不大吧Top
9 楼newbiestar()回复于 2005-08-04 09:50:45 得分 5
明摆着的强制类型转换,因为1默认(即没有修饰的情况下)为整形文字常量,要作为一个可以调用的函数指针来使用的话必须进行一个强制类型转换
至于那个多余的空格么,要知道cpp对宏的替换是对宏名以后整个行(除了注释),也就是说那个空格和后面的1都会进去的。在替换以后,强制类型转换由于和那个1不是一个词法单元中的元素,所以多加上一个空格也不会有什么问题。Top
10 楼WindYou(WindYou)回复于 2005-08-04 09:59:46 得分 0
#define SIG_IGN (void(*)())1 中(void(*)())是对1的强制转换Top
11 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-04 10:19:36 得分 0
噢,我明白了,这跟
a=b+c;和a = b + c ;一个道理的。唉,脑袋没转过弯来,傻冒了一次。Top




