4

だから、これは私の友人の学生からのコードです…</ p>

#include <stdio.h>

int main(){
    int hours;
    int take_one_number(void);{
        scanf("%d",&hours);
    }
    int minutes;
    int take_one_number(void);{

        scanf("%d",&minutes);
    }
    int seconds;
    int take_one_number(void);{

        scanf("%d",&seconds);
    }
    int all;
    printf("%d",all=hours*3600+minutes*60+seconds);
    return all;

}

ええと、それは…コンパイルします…そして…ええと、動作します…先生の要求に応じて…</ p>

私の質問:私が正しく理解していればtake_one_number、関数ポインタを格納するための変数の定義は次のとおりです。GCCもLLVMも、これらの定義で重複した識別子について文句を言わないのはなぜですか?

4

4 に答える 4

4

関数take_one_numberは3回宣言されていますが、定義されていません。いずれの場合も、; (void)が宣言を終了した後。その場合、scanfステートメントはmain()内の単なる通常のステートメントであり、意味のないスコープ{}に囲まれています。

于 2013-03-03T03:54:38.817 に答える
3

上記のコードでは、

 int take_one_number (void);

は関数ポインタではなく、関数プロトタイプまたは宣言です。関数は複数回宣言できますが、定義する必要があるのは1回だけです。

于 2013-03-03T03:56:21.913 に答える
2
int take_one_number(void);

これは、戻り型が。である関数宣言ですint。変数の定義ではありません。また、変数のスコープは変数宣言が行われていないため、ここではほとんど意味がありません。

于 2013-03-03T03:54:59.150 に答える
2

int take_one_number(void);は、この名前とプロパティで実装された関数があることをコンパイラに通知する関数プロトタイプです。新しい関数を定義しておらず、その関数を使用していないため、コンパイラは文句を言いません。

このプロトタイプの後に続くブロックは、セミコロンで区切られているため、take_one_numberの一部ではないことにも注意してください。ブロックを独立したスコープブロックとして作成します。より明確にするために、関数プロトタイプとその隣のコードブロックの間にセミコロンがない場合、コンパイルエラーが発生します。

于 2013-03-03T03:55:37.807 に答える