【例6.1】下面程序没有找出错误,但编译就出错,是何问题?
#include <stdio.h> int main ( ) { char st[18] ; printf (" 输入:" ); gets (st ); back (st ); return 0 ; } void back (char st ) { printf (st ); printf ("\n" ); return ; }
当编译到主程序的
back (st );
语句时,编译系统不清楚back的含义,所以报错。
如果函数back在主函数之前定义,编译系统就知道back是函数调用,能顺利编译。如果不想把back函数定义在主函数之前,就必须在主函数前面先声明back函数,声明的方式就是给出这个函数的原型,又称为原型声明。一般把它们放在包含语句之后,主函数之前。声明中可以有变量名,例如:
void back (char st[ ] );
也可以只给出变量的数据类型,例如:
void back (char [ ] );
【例6.2】下面程序编译出错,是何问题?
#include <stdio.h> int sum (int ,int ,int ); int main ( ) { printf ("Sum=%d\n" ,sum (1 ,3 ,5 )); return 0 ; } int sum (a ,b ,c ) { int a ,b ,c ; return a+b+c ; }
【解答】编译给出如下错误信息。
error C2082 : redefinition of formal parameter 'a' error C2082 : redefinition of formal parameter 'b' error C2082 : redefinition of formal parameter 'c'
这是函数sum定义错误。老的定义方式是在参数列表中给出变量名,单变量的声明不是在函数中,而是在“{”之前,声明的方式跟变量的声明一样。例如:
int sum (a ,b ,c ) int a , b c ; { return a+b+c ;}
或者
int sum (a ,b ,c ) int a ; int b ; int c ; { return a+b+c ;}
也可以
int sum (a ,b ,c ) int a ; int b ; int c ; { return a+b+c ;}
后一种方式方便对参数进行注释。目前Windows的一些程序常采用这种方式。
新的方式是在参数列表中给出数据类型,在函数里直接使用。例如:
int sum (int a , int b , int c ) { return a+b+c ;}