変数が関数ではなく.cppファイルのグローバルスコープにある場合、変数にstatic
としてフラグを立てる用途はありますか?
関数にもstaticキーワードを使用できますか?はいの場合、それらの用途は何ですか?
この場合、キーワードstaticは、関数または変数が同じcppファイル内のコードでのみ使用できることを意味します。関連するシンボルはエクスポートされず、他のモジュールで使用できなくなります。
これは、グローバル関数または変数が他のモジュールで必要ないことがわかっている場合に、大きなソフトウェアで名前が衝突しないようにするための良い方法です。
はい、ファイルスコープ変数を宣言する場合は、static
キーワードが必要です。ある変換ユニットで宣言されたstatic
変数は、別の変換ユニットから参照することはできません。
ちなみに、static
キーワードの使用はC++ 03では非推奨です。
C++ Standard(2003)のセクション$ 7.3.1.1/2には、次のように書かれています。
名前空間スコープでオブジェクトを宣言する場合、staticキーワードの使用は非推奨になります。 unnamed-namespaceは、優れた代替手段を提供します。
C++は、static
キーワードよりもunnamed名前空間を優先します。このトピックを参照してください:
例として-
// 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();
}
これらは両方とも、プログラムが終了/終了したときにのみ存在しなくなります。