作者在 2010-11-02 16:41:33 发布以下内容
extern void _sig_ign __P ((int sig)); 理解为_sig_ign为函数名, __P() 为宏定义。
例如:#define __P(s)s 然后上面的声明编译结果为extern void _sig_ign(int sig);这样可以通过这个宏控制此函数的参数类型,如果:#define __P(s)(void)则这个函数变为无参数。P应该是parameter的意思。
extern void _sig_ign __P ((int sig));这种写法是一种比较普遍的编程风格,你可以google一下__P,会发现很多类似这种的函数声明,C库里面很多函数如此声明主要原因是ANSI C之前的旧编译器不支持函数原型定义,使用“__P”宏为ANSI和非ANSI的编译器提供一种可移植的方案。其定义通常如下:
# if defined(__STDC__) || defined(__GNUC__)
# define __P(x) x
# else
# define __P(x) ()
# endif
这样ANSIC的编译器会把这句编译为extern void _sig_ign(int sig);
非ANSI C的编译器会把它编译为 extern void _sig_ign();
均不会报错,这样使得在不同编译器下都可以使用,增加了代码的可移植性。
总之,一句话 __P()宏是为兼容老的编译器(非ANSI的编译器)而想出的折衷。
)