为什么需要函数原型?
原型描述了函数到编译器的接口,也就是说,他把函数的返回值的类型(如果有的话)以及参数的类型和数量告诉了编译器,比如。看下面这段代码:
double volume=cube(side);
首先,原型告诉编译器,cube有一个double参数,如果程序没有提供这样的参数,原型将让编译器能够捕获这种错误。其次,cube()函数完成计算之后,将会把返回值放到指定的位置---可能是CPU寄存器,也可能是内存中。然后调用函数(这里为Main)将从这个位置获得值。由于原型中指出了cube()的类型为double,因此编译器知道应该检索多少个字节以及如何解释它们。如果没有这些信息,编译器将只能猜测,而编译器是不会这样做的。
原型的语法
函数原型是一条语句,因此必须以分号结束。获得原型最简单的方法就是,复制函数定义中的函数头,并且添加分号。对于cube(). 我们应该这样定义这个函数
double cube(double x);
然而,函数原型不要求提供变量名,有类型列表就足够了。对于cheers()的原型。该程序只提供了参数类型。
void cheers(int);
通常,在原型的参数列表中,可以包括变量名,也可以不包括。原型中的变量名相当于占位符。因此不必与函数中的变量名相同。
C++和ANSI原型
ANSI C中借鉴了C++的原型,但是这两种语言还是有区别的。其中最重要的区别就是,为与基本C兼容,ANSI C中的原型是可选的。但是在C++中。原型是必不可少的。比如:请看下面声明:
void say_hi();
在C++中,括号为空与在括号中使用关键字void是等效的---意味着函数没有参数,在ANSI C中,括号为空意味着不指出参数---这意味着在后面的参数定义列表中。在C++中。不指定参数列表时候应该省略号:
void say_bay(...);
通常,仅当与可变参数的C函数,比如print交互的时候才需要这样做。