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

4

4 に答える 4

6

理由はまったくありません。これはプロトタイプの無意味な繰り返しです。

于 2013-01-31T16:42:26.153 に答える
4

これらは定義ではなく関数の宣言にすぎません。count関数が2回宣言されている理由はよくわかりません。宣言は、この名前の何かがあることをコンパイラに伝えているだけです。おそらく、プログラマはメソッドを定義するのを忘れていませんか?

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

たとえば、宣言は次のようになります。

void count(void);

たとえば、定義は次のようになります。

void count(void){

......

}
于 2013-01-31T16:47:35.520 に答える
3

関係ありません-あなたのプログラムにとって意味のあるところならどこでも。明らかに、それがメイン内にある場合、実際の関数実装の前に他の関数が関数プロトタイプが何であるかを「知る」ことはなく、影響を与える可能性があります。

私は個人的に、呼び出される前に関数を実装する傾向があります。そうすることで、プロトタイプを配置する場所の問題を回避できます[ヘッダーファイルに格納されている場合を除きます。この場合、問題は解決する傾向があります]。

于 2013-01-31T16:42:59.830 に答える
1

理由を教えていただけますか?tnx

それが単純な間違いであること以外に理由はありません。著者は単に冗長な宣言を見逃しました。両方の宣言が同じである限り、それは問題ではありません(ただし、醜いのでクリーンアップする必要があります)。

FWIW、これが、同じファイル内で使用される前に常に関数を定義する理由です。定義は宣言としてカウントされるため、心配するプロトタイプは1つだけです。

于 2013-01-31T21:48:47.733 に答える