繁体   English   中英

什么是C程序中的“原型”?

[英]What are “prototypes” in a C program?

这本书是我用来学习C的书,它解释了我无法正确理解的“原型”。 在本书中,以下示例代码解释了这些“原型”。 这是什么意思? 什么是“原型”?

//* two_func.c -- a program using two functions in one file */
#include <stdio.h>
void butler(void);
int main(void)
{
    printf("I will summon the butler function.\n");
    butler();
    printf("Yes! bring me some tea and writable DVD's.\n");
    getchar();
    return 0;
}

void butler(void)   /*start of function definition*/

{
    printf("You rang,sir.\n");

}

请简单说明。

函数原型 (也称为“转发声明”)声明函数而没有立即提供“ body”。 您除了要编写函数本身以外,还要编写原型,以便告诉编译器您在其他地方定义的函数:

您的原型void butler(void); 完成以下所有操作:

  • 它告诉编译器函数butler存在,
  • 它告诉男butler接受任何参数,并且
  • 它告诉男butler不返回任何东西。

原型很有用,因为它们可以帮助您隐藏函数的实现细节。 您将原型放在库的头文件中,并将实现放在C文件中。 这使得依赖于您的库的代码可以与您的代码分开进行编译-这是非常重要的事情。

这是原型:

void butler(void);

基本上,它将butler定义为不带参数且没有返回值的函数。 即使尚未真正定义butler函数,它也可使编译器继续前进。 请注意,原型不包含任何实际代码。 它只是从外部定义了管家功能的外观。 实际代码可以稍后在文件中提供。

如果您的代码是

#include <stdio.h>

int main(void) {
    butler(); // note this line
}

void butler() { return; }

编译器会在note this linenote this line处停下来,抱怨butler()不存在。 它不会先扫描整个文件中的函数,而只会在遇到的第一个未定义函数调用处停止。

原型包括函数的返回类型,其名称以及您传递的不同类型参数的顺序。 如果在调用函数之前编写函数定义,则不需要原型。 但是,就像您的示例一样,函数butler()在其定义之前被称为,因此,有必要提供一个原型来告知编译器,该函数存在,并且将返回类型和参数。 否则,在调用函数后编写函数定义将导致错误。

在这种情况下, 原型是C中更通用的术语,称为函数声明,即:

void butler(void);

您可能还会发现它称为函数签名 从概念上讲,这两个术语实际上都更多地指代butler()是如何定义的,它是一个不带任何参数且不返回值的函数,而不是其声明足以满足您以下要求的事实:在您的源代码中使用它。

void butler(void);

称为原型或功能声明。

下面是函数定义。

void butler(void)   /*function definition */

{
    printf("You rang,sir.\n");

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM