問題の歴史: グローバルおよび静的変数は、C言語で関数のローカルコンテキスト外にデータを保存するために導入されました。自動的な事前初期化や実行ファイル内の特別なセクションへの配置はプログラムの動作を最適化しますが、理解していないと明確でない動作を引き起こす可能性があります。
問題: C言語では、グローバルおよび静的変数は、明示的に指定された値またはゼロで自動的に初期化されることに注意が必要です(ゼロ初期化)。初期化はmainの開始前に行われるため、初期化されていないデータへのアクセスのリスクを減少させますが、特定の条件下では複数のモジュールの初期化およびロード順序に関連する予期しない依存関係を引き起こす可能性があります。
解決策:
コードの例:
#include <stdio.h> static int stat_var; int glob_var = 42; int main() { printf("static: %d, global: %d\n", stat_var, glob_var); }
主な特徴:
1. 静的変数の暗黙のゼロ初期化に依存して、安全な実践と見なせますか?
技術的には動作しますが、大規模なプロジェクトでは可読性のため、またコンパイラやリンカの変更を防ぐために、変数を明示的に初期化する方が良いです。
2. 外部関数内に初期化なしで宣言された静的変数の結果はどうなりますか?
それでもゼロで初期化されます:static int value;は実行時に常に0です。
3. 別の孤立したモジュールで初期化子のあるグローバル変数が宣言された場合、初期化はいつ行われますか?
初期化はmainの呼び出し前に行われますが、異なるモジュール間ではそのような変数の初期化の順序は標準で保証されていないため、他のモジュールのコンストラクタ内で初期化されていないデータにアクセスする可能性があります。
開発者は、共通の状態を保持するために静的変数を宣言し、常にそれらが明示的に初期化されると考えていました。
利点:
欠点:
レビューの後、変数は宣言時に明示的に初期化されました。
利点:
欠点: