函数原型

在-{zh-cn:计算机编程;zh-tw:電腦程式設計}-中，函数原型（）或函数接口（）是用于指定函数的名称和类型签名（元数，参数的資料類型和返回值类型）的一种省略了函数体的函数聲明。虽然函数声明规定了函数是如何被实现的，但仅包括对接口的定义（即接受的数据类型和返回的数据类型），并不包括对函数体的定义。

函数原型被广泛应用于C、C++ 语言程序代码的上下文中，通过在头文件中放置函数的前向声明来允许将代码拆分为多个。即编译器可以单独编译目标文件的这部分内容，然后由链接器组合成可执行文件或库。现代编译器（如Arduino IDE）不再需要函数原型，因为这些是在编译时被确定和声明的。

在原型中，参数名是可选的（C/C++中存在函数原型作用域，这使参数名的作用域被限制在函数定义内），但是，类型和修饰符都是必需的（如指针或常量参数）。

在面向对象编程中， 接口和抽象方法的目的与此类似。

 举例 
有函数原型如下：void Sum(int a,int b);或void Sum(int, int);

首先，函数原型包括函数签名（），函数名，返回类型和。在该例中，函数的名称是“Sum”。函数签名确定参数的数量及其类型。在上面的示例中，返回类型为“void”，这意味着该函数不会返回任何值。要注意的是第一个示例中的参数名称是可选的，甚至實際定義時與函式原型中宣告的不同也沒關係。

 应用 
在早期的C语言中，如果一个函数之前没有声明，并且函数名出现在表达式中，后面跟着左括号，那么它会被隐式声明为返回int类型的函数，并且对它的参数没有任何假设。在这种情况下，当函数应用于某些参数时，编译器将无法执行参数类型和语法元数的编译时检查。这可能会导致问题。以下代码说明了隐式声明的函数的行为未定义的情况。

#include <stdio.h>

/* 简体中文：
 * 如果提供此函数原型，编译器将在main函数中捕获错误。
 * 如果省略，则错误可能会被忽略。
 */

/* 正體中文：
 * 若提供此函式原型，編譯器將在main函式中發現錯誤。
 * 若省略，則錯誤可能會被忽略。
 */
int MyFunction(int n);  /* 简：函数原型 正：函式原型 */ 

int main( void )  /* 简：调用函数 正：呼叫函式 */
{
  printf("%d\n", MyFunction());  /* Error: forgot argument to MyFunction */
  return 0;
}

int MyFunction( int n )  /* 简：被调用的函数声明 正：被呼叫的函式宣告 */
{
  if (n == 0)
  {
    return 1;
  }
  else
  {
    return n * MyFunction(n - 1);
  }
}

函数MyFunction被调用时会请求一个位于堆栈或寄存器中的-{zh-cn:整型;zh-tw:整數型別}-参数。如果省略函数原型，编译器将无法执行此操作，函数MyFunction将在堆栈上的其他一些数据上运行（可能是返回地址或当前不在作用域中的变量的值）。通过包含函数原型，您将通知编译器函数myFunction接受一个整型参数，并使编译器能够捕获这些类型的错误，并使编译过程顺利运行。

通过包含函数原型，你可以告知编译器函数MyFunction接受一个整数参数，并使编译器能够捕获这些类型的错误，使编译过程顺利运行。该特性已从C99标准中删除，因此省略函数原型将导致编译错误。

 -{zh-cn:创建库接口;zh-tw:建立函式庫介面}-
通过在头文件中放置函数原型，可以为库指定接口。

 声明-{zh-cn:类;zh-tw:類別}- 
在C++中，函数原型也在类定义中使用。

 参见 
 -{zh-tw:模組化程式設計;zh-cn:模块化编程}-
 协议（面向对象程序设计）
 抽象方法

 参考文献 



Category:计算机编程
Category:C語言家族
Category:子程序