ここには 2 つのファイルがexterndemo1.cありexterndemo2.c、最初のファイルでは、arrファイル スコープで文字配列をexterndemo2.c宣言して初期化しexternましたdisplay()。そこから生じる私の混乱は次のとおりです。次の 3 つに答えてください。
//File No.1--externdemo1.c
#include<stdio.h>
#include "externdemo2.c"
extern int display();
char arr[3]={'3','4','7'};
//extern char arr[3]={'3','4','7'};
//extern int main()
int main()
{
printf("%d",display());
}
//File No.2--externdemo2.c
char arr[3];
int display()
{
return sizeof(arr);
}
1)キーワード inarrなしで宣言したにもかかわらず、プログラムが正常にコンパイルされるのはなぜですか? 関数のデフォルトのリンケージが外部であることを読んだことがありますが、変数についてもそうであるかどうかはわかりません。グローバル変数にはストレージがあることしかわかりません。クラス。externexterndemo2.cextern
2)extern storage classとの厳密な違いは何ですか。これextern linkageについて明確にする必要があります。配列を定義した最初のファイルではarr、キーワードを使用していませんが、デフォルトでクラスexternがあることはわかっています。 2 番目のファイル、つまり、グローバル変数に関するextern storageデフォルトのストレージ クラスまたはリンケージはありませんか?externarrexterndemo2.c
3)最初のファイルのコメントアウトされた行を確認しますexterndemo1.c。テストするために、その行を使用しましたextern char arr[3]={'3','4','7'};が、エラーが発生します'arr' initialized and declared 'extern'。このエラーはどういう意味ですか?コメント行についても言及しましたextern int main()が、エラーや警告なしで正常に動作します。ではextern、関数がexternデフォルトであるのに、変数ではなく関数に使用できるのはなぜarrですか?
この件について私を救済するために、少し時間をください.それは、全体についての私の長引く疑問のほとんどをクリアします.3つのビット1)、2)、および3)externすべてに答えることができれば、それは大きな助けになるでしょう.Especially 3) is eating my brains out