#define SIG_IGN语法问题

luyanfei78 2005-08-03 11:28:26
void(*signal(int sig,void(*disp)(int)))(int);
#define SIG_IGN (void(*)()) 1
void(*)()定义了一个指向函数的空指针,这个空指针后面加个常数又会是怎么回事?是函数的参数?SIG_IGN又可做为参数传入signal中,真是被搞得晕部转向,请大家帮忙解释一下。
...全文
491 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
megaboy 2005-08-04
  • 打赏
  • 举报
回复
噢,我明白了,这跟

a=b+c;和a = b + c ;一个道理的。唉,脑袋没转过弯来,傻冒了一次。
WindYou 2005-08-04
  • 打赏
  • 举报
回复
#define SIG_IGN (void(*)())1 中(void(*)())是对1的强制转换
newbiestar 2005-08-04
  • 打赏
  • 举报
回复
明摆着的强制类型转换,因为1默认(即没有修饰的情况下)为整形文字常量,要作为一个可以调用的函数指针来使用的话必须进行一个强制类型转换

至于那个多余的空格么,要知道cpp对宏的替换是对宏名以后整个行(除了注释),也就是说那个空格和后面的1都会进去的。在替换以后,强制类型转换由于和那个1不是一个词法单元中的元素,所以多加上一个空格也不会有什么问题。
luyanfei78 2005-08-04
  • 打赏
  • 举报
回复
有没有空格应该关系不大吧
luyanfei78 2005-08-04
  • 打赏
  • 举报
回复
有空格的
luyanfei78 2005-08-04
  • 打赏
  • 举报
回复
楼上这位朋友应该是理解对的,书上也讲这些宏是叙谈整数值定义的,我当时一直没搞明白这句话,当是瞎扯。把了个函数指针定义成1,是一个无效的地址。看来C语言真是复杂,本以为不过那么点语法,现在才知这么点语法也能变出些你不认识的花样来。谢谢了。帖子留会儿再结掉。
megaboy 2005-08-04
  • 打赏
  • 举报
回复
(void(*)())和1之间有空格吗?也有可能原书在两者之间多打印了一个空格,如果是(void(*)())1这样是解释得通的,这样就是把1强制转换为指向返回值为空的函数的地址。

如果两者间真的有空格的话,那就要看unix的编译器是如何处理这个空格的,有可能是把这个空格忽略掉。至少在windows下,如下代码是通不过编译的:

#define sign 56 1
int i;
i=sign;

编译的时候马上就出错了。
OpenHero 2005-08-04
  • 打赏
  • 举报
回复
那是不是这个解释哪?
#define SIG_IGN (void(*) ()) 1
定义SIG_IGN 为 1 但是这个1 是(void(*) ())型的
luyanfei78 2005-08-04
  • 打赏
  • 举报
回复
《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)...
不会是印刷错误的。
jixingzhong 2005-08-04
  • 打赏
  • 举报
回复
#define SIG_IGN (void(*)()) 1
void(*)()定义了一个指向函数的空指针,这个空指针后面加个常数又会是怎么回事?是函数的参数?



楼主理解有误

定义的是一个函数指针

void 是返回类型 不是函数类型


另外, 后面的常数 应该是印刷问题

在语法上不能通过这样的定义
megaboy 2005-08-04
  • 打赏
  • 举报
回复
void(*)()不是定义一个指向函数的空指针,而是定义了一个函数指针,这个指针所指向的函数的返回值为空。

我觉得#define SIG_IGN (void(*)()) 1应该是打印错了个1,在楼主那边能通过编译吗?楼主用了什么编译器?至少在我这里是编译不通过的。
1) 本套课程针对高校大学生系统学习C语言而录制,从0基础入门讲起,循序渐进,通俗易懂,同时适用于计算机系及非计算机系的同学。通过学习可以帮助大家掌握C语言本质,轻松面对C语言全国二级考试,并达到能独立完成中型C项目、C游戏的水平;2) 多数高校都开设了C语言课程,网上C语言课程也很多,但普遍存在两个问题: (1) 授课方式单一,大多是照着代码念一遍, 对刚刚接触编程的同学来说,感觉晦涩难懂 (2) 授课内容过度注重语法,没有项目实战支撑,造成课程枯燥无趣。本课程针对上述问题进行了改进 (1) 授课方式采用语法讲解+内存布局示意图+项目的方式,让课程生动有趣好理解 (2) 系统全面的讲解了C语言的核心技术点,还配套录制了《全国计算机二级C语言真题精讲》,让学员在掌握C语言编程的同时,还能轻松面对二级考试;3) 课程详细内容: 常量-变量、分支语句、循环语句、操作符和表达式、函数(库函数、自定义函数、递归调用 )、数组(一维数 组、二维数组、数组作为函数参数、指针数组)、指针(指针和指针类型、二级指针和多级指针、指针表达式解析、指针运算、数 组指针、函数指针、回调函数)、调试技巧、程序环境和预处理(翻译环境、运行环境、预定义符号、#define和#undef、宏和函 数、条件编译、文件包含)、 数据在内存中的存储、内存块分配、static、字符函数和字符串函数、自定义类型(结构体、枚举 、联合)、动态内存管理、文件操作(i/o常量、i/o函数、流)。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧