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