2013-01-31 10 views
8

私は、メニューを扱うプログラムのために実行します。メインで関数を再宣言するのはなぜですか?

私は理解しなければならない主関数の前にすべての関数を宣言し、void関数である関数の1つも内部で言及しましたメイン:それはなぜ

char get_choice(void); 
char get_first(void); 
int get_int(void); 
void count(void); 
int main(void) 
{ 
    int choice; 
    void count(void); 
    while ((choice = get_choice()) != 'q') 
    { 
     switch (choice) 
     { 
      case 'a' : printf("Buy low, sell high.\n"); 
       break; 
      case 'b' : putchar('\a'); /* ANSI */ 
       break; 
      case 'c' : count(); 
       break; 
      default : printf("Program error!\n"); 
       break; 
     } 
    } 
    printf("Bye.\n"); 

...(関数の実装)

あなたは私を教えてくださいことはできますか? tnx

+0

編集のための感謝@djechlin – MNY

答えて

4

これは、定義ではない関数の宣言です。カウント関数が2度宣言されている理由はあまりよく分かりません。宣言は、コンパイラにこの名前のあるものがあると言っているだけです。プログラマがメソッドを定義するのを忘れた?

宣言は、シンボルの基本的な属性である型とその名前を提供します。定義はそのシンボルのすべての詳細を提供します - それが関数であれば、それは何ですか;それがクラスであれば、それが持つフィールドとメソッド。それが変数であれば、その変数が格納されます。

例えば宣言は次のようになります。

void count(void); 

などの定義は次のようになります。つまり、なぜ

void count(void){ 

...... 

} 
6

何も理由はありませんが、これはプロトタイプのちょっと無意味な繰り返しです。

+0

ありがとうallot @unwind – MNY

3

問題はありません - あなたのプログラムにとっては意味があります。明らかに、それがメインの内側にあるならば、実際の関数実装の前の他の関数は、関数プロトタイプが何であるかを「知っている」でしょう。

私は個人的には、プロトタイプを置く場所の問題を避けるために、関数を呼び出す前に実装する傾向があります[ヘッダファイルにない限り、問題を解決する傾向があります]。

+0

おかげでバンチ@MatsPetersson – MNY

1

あなたは私を教えていただけますか? tnx

なぜなら、それは単純な間違いであることを超えてです。作者は単に冗長宣言を逃しただけです。両方の宣言が同じである限り、それは問題ではありません(しかし、それは醜いですが、クリーンアップする必要があります)。

FWIWの理由から、私はいつもの機能を同じファイル内で使用する前に定義しています。定義は宣言としてカウントされるため、心配するプロトタイプは1つだけです。

関連する問題