C言語では、変数は異なるスコープを持つことができます:ローカル(ブロック内)、グローバル(ファイル全体)、ファイルスコープ(static)。スコープの管理は、動作の予測可能性と名前の衝突を防ぐために重要です。
ファイル内のすべての関数で見え、extern で宣言された場合はプロジェクト全体で見えます。
ブロック(例えば関数やループ)に入るときに作成され、その宣言ブロックの外では見えません。
static int foo; — 現在のファイル専用です。
例:
static int counter = 0; // ファイル内のみ void increment() { int temp = 10; // ローカル変数 ++counter; }
グローバル変数とローカル変数が同じ名前を持つ場合、関数内でどちらが使用され、なぜですか?
回答: ローカル変数が使用されます。なぜなら、ローカル変数はそのスコープ内でグローバル名前を「隠蔽」するからです。グローバル変数はローカル変数の宣言ブロックの外ではアクセス可能です。
例:
int value = 5; void foo() { int value = 10; printf("%d", value); // 5ではなく10が表示される }
物語
物語
static を指定するのを忘れた結果、リンク時に名前の衝突を引き起こし、プロジェクトの異なる部分をビルドする際の予測不可能なエラーを引き起こしました。物語
適切な同期なしにグローバル変数がマルチスレッドコードで使用されるケースも見受けられました。暗黙のスコープと異なるスレッドで値を変更する際の不注意により、データ競合が発生しました。