Cでは、外部変数が同じコストでその目的を果たすことができる場合、静的ストレージクラスの使用は何ですか。どちらも実行可能ファイルのデータセグメントのストレージスペースを占有します。
私は外部変数ではるかに良いスコープを持っています。外部変数のスコープを特定のファイルにしたい場合は、この変数を宣言しません。それ以外の場合は、静的ローカル変数であるグローバル変数で多くの柔軟性が見られます。
また、変数のアドレスがあれば、関数の外部でローカル静的変数を参照できます。ローカル静的変数のメモリは、関数のスタックフレームではなく、データセグメントにあります。したがって、静的ストレージクラスはテーブルに独自の機能をもたらします。 。
Staticに私が気付いていない微妙な目的があるかどうかを知りたいだけです。
グローバル変数には「より良い」スコープがあると書きます。これは正しくありません。それはより大きな範囲を持っています。大きいほど良くはありません。
need識別子をより多くの場所に表示する場合は、さらに大きくする必要がありますが、そうでない場合もあります。ただし、スコープが大きいほど、エラーが発生しやすくなります。グローバル変数は、ルーチンが使用および変更するプログラムの状態を確認しにくくすることでルーチンのセマンティクスを混乱させ、ローカル識別子の宣言の失敗によって引き起こされるエラーやその他のエラーの可能性を高めます。
特に、外部リンケージを持つ識別子は、他のライブラリの識別子と衝突します。物理アプリケーションを作成し、acceleration
という名前の外部識別子を持ち、acceleration
という名前の外部識別子も持つ物理ライブラリにリンクするとどうなるかを考えてみてください。プログラムは失敗します。このため、外部識別子は通常、設計が不適切です。
複雑なソフトウェアを開発および保守する当社の能力に対する重大な制限は、人為的ミスです。プログラミング言語のセマンティクスの多くlimitsエラーを防ぐための言語。生のコンピューターでは、2つのポインターを追加したり、スタックポインターを破棄したり、誤ってfloat
のバイトを整数レジスタにロードしたりする可能性があります。優れたプログラミング言語は、これらのエラーを誤って実行することを困難にします。
スコーピングルールがそれらの制御に役立つ前は、グローバル変数はエラーのより大きな原因でした。優れたプログラマーは、識別子の範囲を制限します。
グローバル変数はグローバルであり、どこからでもアクセスできます。
静的ローカル変数にはローカルスコープがあります。静的であるため、その存続期間はアプリケーションの存続期間全体にわたって実行されますが、ローカルスコープ(スコープが関数、ブロック、またはファイルのいずれであっても)からのみアクセスできます。
基本的な違いは、変数のスコープにあります。
1)グローバル変数はプロジェクト全体でグローバルです。プロジェクトに10個の異なるファイルがあるとすると、10個のファイルすべてがグローバル変数にアクセスできます(externの使用方法を参照)。
2)静的変数/関数は、それが定義されている関数/ファイルで使用できます。プロジェクト内の他のファイルで使用することはできません。
それでも、変数の参照を渡すことにより、func2()の静的変数(func1()で定義)を変更できます。以下の例をご覧ください。
void func2(int *i)
{
(*i)++;
}
void func1()
{
static int i;
i=1;
printf("%d\n", i);
func2(&i);
printf("%d\n", i);
}
int main()
{
func1();
return 0;
}
上記のように、func1()にはstatic int i
があり、func2()で直接操作することはできませんが、変数の参照を渡すと、通常の変数と同じように変数を操作できます。
それが役に立てば幸い...
localとglobalの違いは、何よりもまずスコープです。ローカル変数には、定義されているブロック内からのみアクセスできますが、グローバル変数にはどこからでもアクセスできます。 。したがって、グローバルスコープに指定された名前の変数を1つだけ持つことができますが、異なる関数に複数のローカル静的変数を含めることができます。
静的グローバル変数と外部変数の場合と同様に、はい、静的グローバル変数は変換ユニット(つまり、それらが定義されている.cソースファイル)に対してローカルです。
したがって、ここでの主な関心事はスコープの概念であり、ストレージはそこから自然に発生します。
ローカル静的変数を使用する必要がある理由はスコープです。したがって、ローカル静的変数を使用すると、定義された関数の外部で参照できないため、バグが発生しやすい状況を回避できます。