社区
C语言
帖子详情
#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
打赏
收藏
#define SIG_IGN语法问题
void(*signal(int sig,void(*disp)(int)))(int); #define SIG_IGN (void(*)()) 1 void(*)()定义了一个指向函数的空指针,这个空指针后面加个常数又会是怎么回事?是函数的参数?SIG_IGN又可做为参数传入signal中,真是被搞得晕部转向,请大家帮忙解释一下。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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,在楼主那边能通过编译吗?楼主用了什么编译器?至少在我这里是编译不通过的。
172集通俗易懂的C语言从入门到项目实战教程
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函数、流)。
对于APUE中信号的 #
define
SIG
_ERR (void(*)())-1 的理解
在学习 APUE 的信号章节中,我们知道 Linux 中最简单的信号接口如下: #include <
sig
nal.h> void (*
sig
nal(int
sig
no, void (*func)(int)))(int); //返回值:若成功,返回以前的信号处理配置;若出错,返回
SIG
_ERR 参数:
sig
no:上面给出的信号名。 func:常量值
SIG
_
IGN
、常量
SIG
_DEL 或当接到此信号后要调用的函数的地址。如果指定
SIG
_
IGN
,则向内核表示忽略此信号(但是信号
SIG
K
信号编程之
sig
nal函数
作用1:站在应用程序的角度,注册一个信号处理函数。 作用2:忽略信号、设置信号默认处理 信号的安装和恢复 相关宏定义 typedef void (*__
sig
handler_t) (int); #
define
SIG
_ERR ((__
sig
handler_t) -1) #
define
SIG
_DFL ((__
sig
handler_t) 0) #
define
SIG
_
IGN
((__
sig
hand
【linux高级程序设计】(第十章)Linux异步信号处理机制 2
sig
nal安装信号 typedef void (*__
sig
handler_t) (int); __
sig
handler_t
sig
nal (int __
sig
, __
sig
handler_t __handler) :安装信号处理函数,第1个参数是收到的信号,第2个参数是处理的函数指针,返回值也是函数指针。 三个相关的宏 #
define
SIG
_ERR ((__
sig
handler...
宏定义中的 ## ... __VA_ARGS__
宏定义中的##操作符和... and _ _VA_ARGS_ _ 1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used in the replacement section of a function-like macro.Additio
C语言
69,369
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章