为什么_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的文章 。