为什么_PROTOTYPE使用头文件

为什么我们使用_PROTOTYPE例如_PROTOTYPE(void * memset,(void * _s,int _c,size_t _n)我在MINIX3源代码中看到它

因为正如标题块所示,他们不知道是否将使用ANSI编译器或K&R,并且这个marco允许他们将参数保存在ANSI构建中,并将它们丢弃在K&R构建中。

00033 /* Keep everything for ANSI prototypes. */ 00034 #define _PROTOTYPE(function, params) function params 

 00045 /* Throw away the parameters for K&R prototypes. */ 00046 #define _PROTOTYPE(function, params) function() 

意思是

 00483 _PROTOTYPE( void _exit, (int _status) ); 

变成ANSI:

 void _exit(int _status); 

在K&R下:

 void _exit(); 

您链接的源代码解释了它:

00009 *如果_ANSI最终被定义,则为宏
00010 *
00011 * _PROTOTYPE(function,参数)
00012 *
00013 *已定义。 这个宏以不同的方式扩展,产生任何一种
00014 * ANSI标准C原型或旧式K&R(Kernighan&Ritchie)
根据需要,00015 *原型。 最后,一些程序使用_CONST,_VOIDSTAR等
00016 *以这种方式可以通过ANSI和K&R编译器移植。
00017 *此处定义了适当的宏。

旧式K&R原型首先使用参数名称 ,然后是类型:

 int foobar (x, y) int x; float *y; { /* code */ } 

ANSI标准原型在开始时将它们组合在一起:

 int foobar (int x, float *y) { /* code */ } 

_PROTOTYPE宏根据是否定义_PROTOTYPE创建任一类型的适当签名。 在这种特定情况下,K&R签名用于函数实现,但函数声明包括或省略其参数,具体取决于是否定义了_ANSI

值得注意的是,K&R风格的声明可以追溯到1978年,目前大多数C代码都使用现代ANSI风格的签名。 您需要同时支持两种情况。

同时适应K&R和ANSI C函数声明样式。 看看维基百科关于C evolution的文章 。