讀古今文學網 > 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
;}