問題は、変数 A を「グローバル変数」と呼べるかどうかです。一方では A は静的グローバル変数であるため、定義上はグローバルです。もう一方のグローバル変数は、現在の翻訳単位だけでなく、プログラムのすべてのポイントで使用できる必要があります。ありがとう。
#include<stdio.h>
static int A;
void main()
{
...
}
問題は、変数 A を「グローバル変数」と呼べるかどうかです。一方では A は静的グローバル変数であるため、定義上はグローバルです。もう一方のグローバル変数は、現在の翻訳単位だけでなく、プログラムのすべてのポイントで使用できる必要があります。ありがとう。
#include<stdio.h>
static int A;
void main()
{
...
}
いいえ、static
内部リンケージがあるため、 a はグローバルではありません。それを定義する TU ごとにコピーが存在します。
一方で、A は静的グローバル変数なので、定義上グローバルです。
なぜ静的グローバル変数なのですか? static
はい、でもそれだけです。
C++ のグローバル変数は、extern
一度だけ宣言および定義されたもの、またはstatic
メンバーとして含まれるものです (まったく異なる意味を持ちます)。
変数A
には静的ストレージがあり、ファイル スコープで定義されており、内部リンケージがあります。「グローバル変数」という用語は、これらすべてのニュアンスを完全に正確に捉えていない口語表現にすぎません。変数は、すべてのスコープからアクセスできるという意味で確かにグローバルであり、その有効期間はプログラムの開始からプログラムの終了までですが、内部リンケージのため、宣言されている翻訳単位の外部からアクセスすることはできません。
これらの「静的グローバル」を示す特定の広範な用語はないと思います。問題は、標準が「グローバル変数」について一般的に言及していないことですが、2 つの直交する概念を区別しています。
static
ローカル変数と同じ変数の有効期間。標準では、それらすべてを「静的ストレージ期間を持つ変数」と呼んでいます。static
ローカル変数にはローカル スコープがあります。「静的グローバル」を「グローバル」と呼ぶのは正しいですか? すでに述べたように、標準は「グローバル変数」を定義していないため、好みの問題である必要があります。それらはグローバル名前空間スコープで定義されますが、内部リンケージがあるため、他のモジュールではアクセスできません。
それでも、一般に、C++ でグローバルについて話すときは、外部リンケージを持つグローバル名前空間スコープで定義された変数を参照することに注意してください。したがって、全体として、私はそれらをグローバルとは呼びません。それらを呼び出す唯一の明確な方法は、「内部リンケージを使用してグローバル名前空間スコープで定義された変数」です。
すべてのモジュールに表示されるのではなく、1つのモジュール(ここでは「変換ユニット」として意図されています)に表示されるため、モジュール変数と考えてください。
他の人が言ったように、それは「グローバル」であることを気にする理由によって異なります。大規模なソース ファイルでは、静的変数は、非静的関数と同様に、追跡が困難な関数間の結合を導入する可能性があります。もちろん、違いは、静的変数が 1 つのソース ファイルに限定されていることですが、そのソース ファイルに何百もの関数があり、予期しない変更がどこで行われているかを突き止めるために、それらを一通り調べなければならない場合、それはささやかな慰めになります。から。