跳转到内容

函数原型

本页使用了标题或全文手工转换
维基百科,自由的百科全书

计算机编程中,函数原型(英语:Function prototype)或函数接口(英语:Function interface)是用于指定函数的名称和类型签名元数,参数的数据类型和返回值类型)的一种省略了函数体的函数声明英语Declaration (computer programming)。虽然函数声明规定了函数是如何被实现的,但仅包括对接口的定义(即接受的数据类型和返回的数据类型),并不包括对函数体的定义。

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

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

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

举例

有函数原型如下:

void Sum(int a,int b);

void Sum(int, int);

首先,函数原型包括函数签名(英语:function signature),函数名,返回类型和访问修饰符英语Access modifiers。在该例中,函数的名称是“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被调用时会请求一个位于堆栈寄存器中的整型参数。如果省略函数原型,编译器将无法执行此操作,函数MyFunction将在堆栈上的其他一些数据上运行(可能是返回地址英语Return statement或当前不在作用域中的变量的值)。通过包含函数原型,您将通知编译器函数myFunction接受一个整型参数,并使编译器能够捕获这些类型的错误,并使编译过程顺利运行。

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


创建库接口

通过在头文件中放置函数原型,可以为库指定接口。

声明类

在C++中,函数原型也在类定义中使用。

参见

参考文献