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

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

//* two_func.c -- a program using two functions in one file */ #include  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"); } 

请简单解释一下。

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

你的原型void butler(void); 做以下所有事情:

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

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

这是原型:

 void butler(void); 

基本上它将butler定义为不带参数且没有返回值的函数。 它允许编译器继续向前,即使尚未真正定义butler函数。 请注意,原型不包含任何实际代码。 它只是从外部定义管家function的样子。 实际代码可以在文件中稍后出现。

如果您的代码已经存在

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

编译器会停在note this line部分,抱怨butler()不存在。 它不会首先扫描整个文件的函数,它只是停在它遇到的第一个未定义的函数调用。

Prototype包含函数的返回类型,名称以及传递它的不同类型参数的顺序。 如果在调用函数之前编写函数定义,则不需要原型。 但是,正如您的示例中的情况一样,函数butler()在其定义之前被调用,因此,需要一个原型来告诉编译器存在这样一个函数,它将具有返回类型和参数。 否则,在调用函数后写入函数定义将导致错误。

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

 void butler(void); 

您可能还会发现它称为函数签名 。 这两个术语实际上更多地指的是如何从概念的角度定义butler() ,作为一个不接受任何参数但不返回值的函数,而不是它的声明对你来说足够的事实。在源代码中使用它。

 void butler(void); 

被称为原型或function声明。

以下是function定义。

 void butler(void) /*function definition */ { printf("You rang,sir.\n"); }