ここには 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
なしで宣言したにもかかわらず、プログラムが正常にコンパイルされるのはなぜですか? 関数のデフォルトのリンケージが外部であることを読んだことがありますが、変数についてもそうであるかどうかはわかりません。グローバル変数にはストレージがあることしかわかりません。クラス。extern
externdemo2.c
extern
2)extern storage class
との厳密な違いは何ですか。これextern linkage
について明確にする必要があります。配列を定義した最初のファイルではarr
、キーワードを使用していませんが、デフォルトでクラスextern
があることはわかっています。 2 番目のファイル、つまり、グローバル変数に関するextern storage
デフォルトのストレージ クラスまたはリンケージはありませんか?extern
arr
externdemo2.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