为什么_PROTOTYPE使用头文件

时间:2010-04-09 13:35:06

标签: c

为什么我们使用_PROTOTYPE,例如_PROTOTYPE(void * memset,(void * _s,int _c,size_t _n)我在MINIX3 source code

中看到了它

3 个答案:

答案 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