Cのグローバル変数はデフォルトでstatic
またはextern
ですか?
グローバル変数がデフォルトでstatic
の場合、単一のファイルでそれらにアクセスできることを意味しますが、異なるファイルでグローバル変数を使用することもできます。
これは、デフォルトでextern
ストレージがあることを意味しますか?
ストレージクラス(つまり、extern
またはstatic
キーワード)を指定しない場合、デフォルトではグローバル変数に外部リンクがあります。 C99標準から:
§6.2.2識別子のリンク
3)オブジェクトまたは関数のファイルスコープ識別子の宣言にストレージクラス指定子
static
が含まれている場合、識別子には内部リンクがあります。5)関数の識別子の宣言にストレージクラス指定子がない場合、そのリンケージは、ストレージクラス指定子
extern
で宣言されたかのように正確に決定されます。オブジェクトの識別子の宣言にファイルスコープがあり、ストレージクラス指定子がない場合、そのリンケージは外部です。
したがって、extern
キーワードを指定しなくても、他のソースファイル(いわゆるtranslation units)からグローバルにアクセスできます。 )、同じ変数に対してextern
宣言を持つことができるためです。 static
キーワードを使用して内部リンケージを指定すると、別のソースファイルに同じ変数名のextern
宣言が存在する場合でも、別の変数を参照します。
Cでは、初期化子またはストレージクラス指定子を持たないグローバル変数は、静的ストレージ期間および外部リンケージの変数の暫定的な定義です。
翻訳ユニットでは、すべての暫定定義と最大1つの非暫定定義(初期化子を使用した宣言など)が、変数の単一の定義にまとめられます。複数の翻訳単位で同じ変数を定義することは許可されていませんが、「共通の」変数、つまり複数の翻訳単位で同じ変数を暫定的に定義できるようにすることは一般的な拡張です。
Cのグローバル変数は、デフォルトで外部変数です。(つまり、外部リンケージがあります。
外部リンケージを制限するために、グローバル変数に「static」ストレージクラス指定子を使用できます。静的指定子が使用されている場合、変数にはファイルスコープがあります。「extern」キーワードを使用して他のファイルにリンクすることはできません。 。
'static'の指定は、プログラムの使用法によって異なります。