关于<signal.h>中SIG_ERR、SIG_DEL、SIG_IGN定义的问题

linux中signal.h中对对signal的定义是:

void (*signal(int signo,void (*func)(int)))(int);

通过typedef可以转换成这样:

typedef void Sigfunc(int);
Sigfunc *signal(int,Sigfunc *);

也就是说,signal有两个参数,一个是int,一个是Sigfunc ,返回值也是Sigfunc ,该指针指向一个参数为int,无返回值的函数,然而,SIG_ERR的定义是这样的:

#define SIG_ERR (void (*)())-1
#define SIG_DEL (void (*)())0
#define SIG_IGN (void (*)())1

为什么不是这样定义的呢??

#define SIG_ERR (void (*)(int))-1
#define SIG_DEL (void (*)(int))0
#define SIG_IGN (void (*)(int))1

在网上搜索之后找到答案,C语言中是可以这样定义的:

void fun();
int main()
{
       fun(1,2);
}
void fun(int i, int j)
{
      printf("%d\n",i+j);
}

只是将-1强制转换为一个指针,通过编译。就像#define NULL (void *)0。可以将SIG_ERR跟其他的信号理解的一样,是一个整数。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-21 19:43:33

关于<signal.h>中SIG_ERR、SIG_DEL、SIG_IGN定义的问题的相关文章

转载:Windows下stdlib.h与glut.h中exit()函数重复定义的解决方案

最近用到 OpenGL的第三方库Glut,碰到了exit()这个函数在stdlib.h与glut.h两个头文件中重复定义的情况,解决方案如下: 打开glut.h,找到exit()函数定义的地方(144行左右),替换为以下内容: #if defined(_WIN32) # ifndef GLUT_BUILDING_LIB #if _MSC_VER >= 1200 _CRTIMP __declspec(noreturn) void __cdecl exit(int); #else _CRTIMP v

编写一个可变参数的C函数——头文件stdarg.h中宏va_start ,va_arg和va_end的应用

我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:int printf( const char* format, ...);它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:printf("%d",i);printf("%s",s);printf("the number is %d ,string is:%s", i, s);究竟如何写可变参数的

OSIP中的多线程宏定义#ifdef OSIP_MT

OSIP在定义多线程的时候,需要添加锁,如果没有使用到多线程,就没有使用到锁的功能. 文件代码:osip_fifo.h /** * Structure for referencing a fifo. * @var osip_fifo_t */  typedef struct osip_fifo osip_fifo_t; /** * Structure for referencing a fifo. * @struct osip_fifo */  struct osip_fifo  {#ifdef

C++中的声明和定义

<C++Primer>第四版 2.3.5节中这么说到: ① 变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. ② 变量声明:用于向程序表明变量的类型和名字. ③ 定义也是声明:当定义变量时我们声明了它的类型和名字. ④ extern关键字:通过使用extern关键字声明变量名而不定义它. 1.定义也是声明,extern声明不是定义,即不分配存储空间.extern告诉编译器变量在其他地方定义了. 例如:extern int i; //声明,不是定义 int

JAVA中关于数组的定义

前些日子,有网友问:在JAVA中 int[] a 这样定义的数组和 int a[] 定义的数组有什么区别? 当时没有细看,直接回复说,在JAVA中,两者是一样的,没有区别. 回头仔细看时,还是稍有区别的. 按照正常的JAVA编程规范,先定义类型 然后是变量名结束,由此说来 int[] a 是符合JAVA定义变量规范的(推荐用法):而 int a[] 则可能是为了兼容C++中的变量定义. 所以,来看下面几个数组定义的区别: int[] a; int b[]; int[] c []; int[] d

C++ 模板类的实现为何放在.h中

主要原因:C++标准明确表示,当一个模板不被用到的时侯它就不该被实例化出来: 如以下代码:main.cpp中调用到模板类A的方法A<int>::f,因A<int>::f在test.cpp中实现,编译器在#1处并不知道A<int>::f的定义,故寄希望于连接器,实际上test.cpp编译出来的test.obj文件中关于A::f一行二进制代码也没有,因为模板类A在test.cpp未被实例化,此时连接器就会报错.所以,必须把模板类的实现放在.h中,此时main.cpp中调用A

c#中枚举类型的定义与使用

介绍枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举.定义默认基数从O开始,也可指定数值. enum Days { Saturday=1, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 }; 使用

Linux中 pid_t 类型的定义.

说明:涉及到的头文件(.h),目录默认都是基于 /usr/include/ 目录. 1.在 "/sys/types.h"中,有下列内容: 1 #include <bits/types.h> 2 #ifndef __pid_t_defined 3 100 typedef __pid_t pid_t; 4 101 # define __pid_t_defined 5 102 #endif 很明显, pid_t 只是 __pid_t 的别名.或者说, pid_t 类型其实是 __

IOS开发中常用的宏定义

有些时候,我们需要将代码简洁化,这样便于读代码.我们可以将一些不变的东东抽取出来,将变化的东西作为参数.定义为宏,这样在写的时候就简单多了. 下面例举了一些常用的宏定义和大家分享: 1. 判断设备的操作系统是不是ios7 #define IOS7 ( [[[UIDevice currentDevice].systemVersion doubleValue] >= 7.0] ) 2. 判断当前设备是不是iPhone5 #define kScreenIphone5 (([[UIScreen main