首页 » C语言解惑 » C语言解惑全文在线阅读

《C语言解惑》6.1 函数的声明与定义

关灯直达底部

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