2

私の知る限り、グローバル変数は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」は、それが定義されているモジュールにどのような種類のストレージ クラスを持っていますか?

4

4 に答える 4

2

IIRCexternは、コンパイラが値にストレージを割り当てる必要がないというヒントです。リンカーは、別のコンパイル単位で値を見つけることが期待されています。通常extern、誰かが名前に関連付けられたストレージを定義したことを示すためにヘッダー ファイルで使用されます。値の定義にはキーワードが含まれていません。これはextern、コンパイラが定義を含むコンパイル単位で値のストレージを割り当てる必要があるためです。

詳細については、 extern ストレージ クラス指定子を参照してください。

于 2011-04-12T11:45:01.203 に答える
0

実際には、2つのストレージクラスを見逃しました。autoとregister
Registerはここでは重要ではありませんが、デフォルトのストレージクラスはautoです。
Autoは、メモリ内のどこかに変数用のスペースを予約します(これは通常、変数を宣言するときに必要なものです)。「自動変数」の場合、変数のスコープが入力されるたびに新しいスペースが割り当てられることに注意してください。(つまり、func()が'auto'変数を宣言するときに、func()内から関数func()を呼び出すと、2つの異なる変数が生成され、func()を呼び出すたびに、それ自体の変数のみが認識されます
。グローバルスコープで宣言されたものは一意になります(スコープは一度だけ入力されるため)。
ただし、静的変数は常に一意です。スペースが1回だけ割り当てられるという意味でユニークです。これは、func()がfunc()を呼び出し、両方の関数呼び出しを同じ変数で操作する場合に役立ちます。
外部変数は、単に一意の変数への参照です。
これらは、別のファイルで宣言されたグローバル変数にアクセスする場合に使用します。
ファイル1.cおよび2.cを考えると、「intglobal;」を宣言するだけでは不十分です。スペースが2回割り当てられ、名前の衝突によりリンクエラーが発生するため、両方のファイルで。
したがって、1つのファイルでスペースを予約し(「intglobal;」を使用)、もう1つのファイルで、「extern int global;」と記述して、別のファイルで「global」という名前の変数を探すようにリンカーに指示します。

于 2011-04-12T12:03:56.960 に答える
0

extern 変数は、それが定義されているユニットでグローバル スコープ (エクスポート) で定義されます。

int baz = 5;

于 2011-04-12T11:41:47.010 に答える
0

デフォルトのストレージ クラスはautoです。

于 2011-04-12T11:42:34.533 に答える