-1
#include<stdio.h>
int check,check;
void main(){
    printf("Hello!!");
}

このコードをコンパイルすると、すべて正常に動作しますが、メイン関数内でこれを指定すると、

#include<stdio.h>
void main(){
int check,check;
    printf("Hello!!");
}

次のようなエラーが表示されます

C:\MinGW\bin>cc ex1.c
ex1.c: In function 'main':
ex1.c:4:11: error: redeclaration of 'check' with no linkage
 int check,check;
           ^
ex1.c:4:5: note: previous declaration of 'check' was here
 int check,check;
     ^

なぜそうなのですか?

4

1 に答える 1

1

これは暫定的な定義と見なされるため、グローバル スコープで可能です。

引用C11、章§6.9.2

初期化子なし、ストレージ クラス指定子なし、またはストレージ クラス指定子を使用したファイル スコープを持つオブジェクトの識別子の宣言は、static暫定的な定義を構成します。

ただし、ブロック スコープ (関数スコープ) には暫定的な定義がないため、コードは同じ名前の 2 つの識別子を作成しようとします。これが再宣言エラーの原因です。これらは実際には同じオブジェクトを示しているためです。

詳細については、こちらをご覧ください。

とはいえ、C99ホストされた環境の場合、void main()はもはや有効な署名ではないためint main(void)、少なくとも署名する必要があります。

于 2016-09-29T14:49:21.093 に答える