web-dev-qa-db-ja.com

Cのグローバル変数は静的かどうか?

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

17
Mishthi

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

§6.2.2識別子のリンク

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

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

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

32
Adam Rosenfield

Cでは、初期化子またはストレージクラス指定子を持たないグローバル変数は、静的ストレージ期間および外部リンケージの変数の暫定的な定義です。

翻訳ユニットでは、すべての暫定定義と最大1つの非暫定定義(初期化子を使用した宣言など)が、変数の単一の定義にまとめられます。複数の翻訳単位で同じ変数を定義することは許可されていませんが、「共通の」変数、つまり複数の翻訳単位で同じ変数を暫定的に定義できるようにすることは一般的な拡張です。

7
CB Bailey

Cのグローバル変数は、デフォルトで外部変数です。(つまり、外部リンケージがあります。

外部リンケージを制限するために、グローバル変数に「static」ストレージクラス指定子を使用できます。静的指定子が使用されている場合、変数にはファイルスコープがあります。「extern」キーワードを使用して他のファイルにリンクすることはできません。 。

'static'の指定は、プログラムの使用法によって異なります。