有关 __P()宏

作者在 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的编译器)而想出的折衷。

C | 阅读 748 次
文章评论,共0条
游客请输入验证码
浏览25444次