原型的功能
原型能够帮助编译器完成许多工作。并且极大的降低程序出错的概率。具体来说,原型确保以下几点:
- 编译器正确处理函数返回值
- 编译器检查使用的参数数目是否正确
- 编译器检查使用的参数类型是否正确。如果不正确,就转换成正确的类型。
前面已经讨论过了如何正确处理返回值。下面我们来研究下数目不对的时候发生的情况。例如。假设进行了以下调用:
double z=cube();
如果没有函数原型,编译器将允许他通过。当函数被调用时,它将找到cube()调用存放值的位置,并且使用这里的值。这正是ANSIC从C++借鉴原型之前。C语言的工作方式。由于对于ANSI C来说,原型是可选的。因此有些C++程序就是这样工作的。但是在C++中,原型不是可选的。因此可以确保不会发生这样的错误。
接下来,假设提供一个参数。但是其类型不正确。在C语言中,这会造成奇怪的错误。比如,如果函数需要一个int值(16位)。而程序员传递了一个double值(64位)。而函数只会检查64位中的前16位。并试图将他们变成一个int值。但是C++总能自动将传递的值转换位原型中指定的类型。条件是两者都是算术类型。
通常来说,原型自动将被传递的参数转换为需要的类型。原型不会将整数转化为结构或者指针
自动类型转换并不能避免所有的错误。当较大的值自动转换为较小的值的时候。有些编译器发出警告。指出这可能会丢失数据。