私の知る限り、グローバル変数はCの1つから2つの異なるストレージクラスである可能性があり、宣言は2つの異なるキーワードで与えられる可能性があります。
extern int foo; //default
static int bar;
静的変数は、宣言のモジュール内でのみ表示され、エクスポートできません。extern 宣言の場合、変数は、静的変数によってシャドウされていない限り、リンクされたすべてのモジュールの共通の名前空間にあります。
静的変数はモジュール内で定義する必要がありますが、extern 変数は別の場所で定義できます。使用する場合は定義する必要があります。
私のコンパイラ(GCC)は受け入れます
static int bar = 5;
しかし、不平を言う
extern int foo = 4;
extern 変数がキーワード「extern」で定義されることは決してないと予想されるようです。これは、次の質問につながります。
上記の例のオブジェクト「foo」は、それが定義されているモジュールにどのような種類のストレージ クラスを持っていますか?