为什么我们使用_PROTOTYPE,例如_PROTOTYPE(void * memset,(void * _s,int _c,size_t _n)我在MINIX3 source code
中看到了它答案 0 :(得分:5)
因为正如标题块所说,他们不知道是否会使用ANSI编译器或K& R,并且这个marco允许他们将参数保存在ANSI构建中,并将它们丢弃在K& ; R build。
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();
答案 1 :(得分:3)
您链接的源代码解释了它:
<00> 00009 *如果_ANSI最终定义,则为宏 00010 *
00011 * _PROTOTYPE(功能,参数)
00012 *
00013 *已定义。这个宏以不同的方式扩展,产生任何一个 00014 * ANSI标准C原型或旧式K&amp; R(Kernighan&amp; Ritchie)
根据需要,00015 *原型。最后,一些程序使用_CONST,_VOIDSTAR等 00016 *以这样的方式,它们可以通过ANSI和K&amp; R编译器移植 00017 *此处定义了适当的宏。
旧式K&amp; R原型首先使用 names 参数,然后是类型:
int foobar (x, y)
int x;
float *y;
{
/* code */
}
ANSI标准原型在开始时将它们组合在一起:
int foobar (int x, float *y) {
/* code */
}
_PROTOTYPE
宏根据是否定义_ANSI
创建任一类型的适当签名。在这种特定情况下,K&amp; R签名用于函数实现,但函数声明包括或省略它们的参数,具体取决于是否定义了_ANSI
。
值得注意的是,K&amp; R风格的声明可以追溯到1978年,目前大多数C代码都使用现代ANSI风格的签名。您需要同时支持两者。
答案 2 :(得分:1)
同时适应K&amp; R和ANSI C函数声明样式。看看Wikipedia article about C evolution。