CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

#define SIG_IGN语法问题

楼主luyanfei78(漠漠轻寒)2005-08-03 23:28:26 在 C/C++ / C语言 提问

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

相关问题

  • vc里面的#define在C#语言中有没有能相对应的语法?
  • 语法分析!
  • 语法错误???
  • 语法问题
  • 语法问题!!!
  • link的语法???????????????
  • 问点语法
  • case 语法
  • 清教语法
  • 语法问题

关键词

  • 函数
  • 指针
  • 语法
  • 转换
  • ign
  • 定义
  • 空格
  • define sig
  • sig
  • 调用

得分解答快速导航

  • 帖主:luyanfei78
  • OpenHero
  • megaboy
  • newbiestar

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo