2011-01-18 20 views
20

変数にstaticというフラグを付ける用途はありますか?それは関数ではなく.cppファイルのグローバルスコープにありますか?グローバルスコープでの静的変数と関数の使用

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

+2

宿題のような音 –

+27

誰かが宿題を呼んでいるように聞こえる –

答えて

14

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

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

+11

C++では名前のない名前空間を使用する必要があります。 –

16

はい、ファイルスコープ変数を宣言する場合は、staticキーワードが必要です。 static 1つの翻訳単位で宣言された変数は、別の翻訳単位から参照することはできません。


ところで、staticキーワードの使用はC++ 03では推奨されていません。 C++標準から

セクション7.3.1.1 $/2(2003)を読み取り、

静的キーワードの使用は 名前空間スコープのオブジェクトを宣言する場合、非推奨 あります。 名前の付いていない名前空間は、代替の上位 を提供します。

C++はstaticキーワードオーバー無名の名前空間を好みます。このトピックを参照してください。

例にとって

Superiority of unnamed namespace over static?

+6

最新のC++ 0xドラフトでは、それを廃止しました。 –

+2

@Fred:それは面白い! – Nawaz

+0

@Fred:面白いです、それはn3092とn3225の間で変わりました、あなたはこの変化を動機付けしたことを知っていますか? –

1

-

// 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();     
} 

彼らのプログラムが終了した場合にのみ/終了を存在するため、両方の停戦。

+0

しかし、関数スコープの静的変数は、実行時に、またはスコープされた関数(この場合はfoo()が実行されたとき)にのみ初期化されますか? –

+0

@Maheshデフォルトでstaticを指定しないと、globalVarは静的ではありませんか?静的でないグローバル変数を簡単に拡張できると思います。 – starkk92

関連する問題