映月读书网 > C语言解惑 > 6.1 函数的声明与定义 >

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