【例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;}