web-dev-qa-db-ja.com

グローバルスコープでの静的変数と関数の使用

変数が関数ではなく.cppファイルのグローバルスコープにある場合、変数にstaticとしてフラグを立てる用途はありますか?

関数にもstaticキーワードを使用できますか?はいの場合、それらの用途は何ですか?

22
org 100h

この場合、キーワードstaticは、関数または変数が同じcppファイル内のコードでのみ使用できることを意味します。関連するシンボルはエクスポートされず、他のモジュールで使用できなくなります。

これは、グローバル関数または変数が他のモジュールで必要ないことがわかっている場合に、大きなソフトウェアで名前が衝突しないようにするための良い方法です。

16
Benoit Thiery

はい、ファイルスコープ変数を宣言する場合は、staticキーワードが必要です。ある変換ユニットで宣言されたstatic変数は、別の変換ユニットから参照することはできません。


ちなみに、staticキーワードの使用はC++ 03では非推奨です。

C++ Standard(2003)のセクション$ 7.3.1.1/2には、次のように書かれています。

名前空間スコープでオブジェクトを宣言する場合、staticキーワードの使用は非推奨になります。 unnamed-namespaceは、優れた代替手段を提供します。

C++は、staticキーワードよりもunnamed名前空間を優先します。このトピックを参照してください:

静的よりも名前のない名前空間の優位性?

19
Nawaz

例として-

// At global scope
int globalVar; // Equivalent to static int globalVar;
               // They share the same scope
               // Static variables are guaranteed to be initialized to zero even though
               //    you don't explicitly initialize them.


// At function/local scope

void foo()
{
    static int staticVar ;  // staticVar retains it's value during various function
                            // function calls to foo();                   
}

これらは両方とも、プログラムが終了/終了したときにのみ存在しなくなります。

1
Mahesh