web-dev-qa-db-ja.com

静的とグローバル

以下のようなCファイルがある場合、ijの違いは何ですか?

#include <stdio.h>
#include <stdlib.h>

static int i;
int j;

int main ()
{
    //Some implementation
}
63
Vijay

iには内部リンケージがあるため、他のソースファイル(厳密には翻訳単位)でiという名前を使用して同じオブジェクトを参照することはできません。

jには外部リンケージがあるため、別の変換単位でjを宣言する場合、externを使用してこのオブジェクトを参照できます。

59
CB Bailey

iはモジュールの外部からは見えません。 jはグローバルにアクセス可能です。

つまり、それにリンクされている別のモジュールが行うことができます

extern int j;

jの値を読み書きできます。同じ他のモジュールはiにアクセスできませんが、その独自のインスタンスを宣言できます。最初のモジュールには表示されないグローバルインスタンスも宣言できます。

21
wallyk

違いは、iには内部リンケージがあり、jには外部リンケージがあります。これは、リンクする他のファイルからjにアクセスできることを意味しますが、iは宣言されているファイルでのみ使用できます。

4
Hans W

i静的リンケージになります。つまり、変数は現在のファイルでのみアクセス可能です。

jexternとして定義する必要があります。つまり、

extern int j;

別のヘッダーファイル(.h)、そして外部リンケージを持ち、ファイル間でアクセスできます。

3
Ramakrishna

静的変数/関数のスコープは、異なるソースファイルの一部としてファイルを含めても、同じファイル内にあります。

グローバル変数のスコープは、それが含まれるファイル全体です。別のソースファイルに変数を含めるには、変数宣言の前にexternを使用します。この場合、変数にメモリは再び割り当てられません。

externは、C変数を定義せずに宣言するために使用されます。 externキーワードは、C変数およびC関数の可視性を拡張します。デフォルトでは、関数はプログラム全体に表示されるため、関数の宣言/定義でexternを使用する必要はありません。その使用は冗長です。

1
Sravya