2010-11-21 11 views
17

グローバル変数はC staticまたはexternですか?
グローバル変数がデフォルトでは静的な場合は、1つのファイルでグローバル変数にアクセスできることを意味しますが、異なるファイルでグローバル変数を使用することもできます。
これは、デフォルトでexternストレージがあることを意味しますか?Cのグローバル変数は静的かどうか?

答えて

30

ストレージクラス(つまり、externまたはstaticのキーワード)を指定しないと、デフォルトではグローバル変数に外部リンケージが設定されます。 C99標準から:識別子

3の

§6.2.2リンケージ)オブジェクトまたは関数のファイルスコープ識別子の宣言は、ストレージクラス指定static、識別子が含まれている場合内部結合を有する。

5)関数の識別子の宣言にストレージクラス指定子がない場合、そのリンケージは、ストレージクラス指定子externで宣言されているかのように正確に決定されます。オブジェクトの識別子の宣言にファイルスコープがあり、ストレージクラス指定子がない場合、そのリンケージは外部にあります。

あなたがexternキーワードを指定しない場合でも、彼らはまだ同じ変数のextern宣言を持つことができるので、だから、グローバルはまだ、他のソースファイル(いわゆる翻訳単位)によってアクセスすることができます。 staticキーワードを使用して内部リンケージを指定すると、別のソースファイル内の同じ変数名のextern宣言が存在する場合でも、別の変数を参照します。 Cにおいて

+1

..「静的」を指定

は、プログラムの使用状況によって異なります。..関連する使用、その変数がスコープを提出しました..ですあなたは「のextern」キーワードを使用して他のファイルにリンクすることはできません:暫定的な定義を記述するセクション6.9.2。そのセクションの§4はファイルスコープ変数の複数の定義がどのように相互作用するかを明示的に示しています – Christoph

+0

Thanx sir ........ "static extern varx"とは何ですか? – Mishthi

+0

@Mishthi:静的変数と外部変数の両方を意味するのですか?私はそれが不可能ではないかと思います。 –

6

、初期または任意のストレージ・クラス指定を持たないグローバル変数は、静的記憶期間外部リンケージと変数の仮定義です。

翻訳単位では、すべての仮定義と非仮定義(例えば、初期化子を含む宣言からのもの)は、変数の単一の定義に集約されます。複数の翻訳単位で同じ変数の定義を持つことは許可されていませんが、共通の変数、つまり複数の翻訳単位で同じ変数の仮定義を許可することは共通の拡張です。外部リンケージを制限するためにCで

3

グローバル変数のデフォルトのextern ...(IE)によって、彼らは外部リンケージを持っている...

静的な場合は、「静的」ストレージクラス指定子は..グローバル変数のために使用することができます指定子はまた

関連する問題