以下のようなCファイルがある場合、i
とj
の違いは何ですか?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
i
には内部リンケージがあるため、他のソースファイル(厳密には翻訳単位)でi
という名前を使用して同じオブジェクトを参照することはできません。
j
には外部リンケージがあるため、別の変換単位でj
を宣言する場合、extern
を使用してこのオブジェクトを参照できます。
i
はモジュールの外部からは見えません。 j
はグローバルにアクセス可能です。
つまり、それにリンクされている別のモジュールが行うことができます
extern int j;
j
の値を読み書きできます。同じ他のモジュールはi
にアクセスできませんが、その独自のインスタンスを宣言できます。最初のモジュールには表示されないグローバルインスタンスも宣言できます。
違いは、i
には内部リンケージがあり、j
には外部リンケージがあります。これは、リンクする他のファイルからj
にアクセスできることを意味しますが、i
は宣言されているファイルでのみ使用できます。
i
は静的リンケージになります。つまり、変数は現在のファイルでのみアクセス可能です。
j
はextern
として定義する必要があります。つまり、
extern int j;
別のヘッダーファイル(.h
)、そして外部リンケージを持ち、ファイル間でアクセスできます。
静的変数/関数のスコープは、異なるソースファイルの一部としてファイルを含めても、同じファイル内にあります。
グローバル変数のスコープは、それが含まれるファイル全体です。別のソースファイルに変数を含めるには、変数宣言の前にextern
を使用します。この場合、変数にメモリは再び割り当てられません。
extern
は、C変数を定義せずに宣言するために使用されます。 extern
キーワードは、C変数およびC関数の可視性を拡張します。デフォルトでは、関数はプログラム全体に表示されるため、関数の宣言/定義でextern
を使用する必要はありません。その使用は冗長です。