ヘッダーファイルで定義されたグローバル変数または定数の前に静的キーワードを使用することになっている場合、誰かが説明できますか?
たとえば、次の行を含むヘッダーファイルがあるとします。
const float kGameSpriteWidth = 12.0f;
static
の前にconst
があるかどうかstatic
を使用するためのベストプラクティスは何ですか?
static
は、変数をファイルに対してローカルにレンダリングします。これは一般に良いことです。たとえば、 このWikipediaエントリ を参照してください。
defineヘッダーファイル内のグローバル変数は使用しないでください。それらを.cソースファイルで定義する必要があります。
グローバル変数を1つの.cファイル内でのみ表示する場合、静的変数として宣言する必要があります。
グローバル変数を複数の.cファイルで使用する場合は、静的変数として宣言しないでください。代わりに、必要なすべての.cファイルに含まれるヘッダーファイルでexternを宣言する必要があります。
例:
example.h
extern int global_foo;
foo.c
#include "example.h"
int global_foo = 0;
static int local_foo = 0;
int foo_function()
{
/* sees: global_foo and local_foo
cannot see: local_bar */
return 0;
}
bar.c
#include "example.h"
static int local_bar = 0;
static int local_foo = 0;
int bar_function()
{
/* sees: global_foo, local_bar */
/* sees also local_foo, but it's not the same local_foo as in foo.c
it's another variable which happen to have the same name.
this function cannot access local_foo defined in foo.c
*/
return 0;
}
別の.c
モジュールからオブジェクトを参照する必要がない限り、.c
ファイルでは常に静的を使用します。
含まれるたびに異なるオブジェクトを作成するため、.h
ファイルでstaticを使用しないでください。
ヘッダーファイルの経験則:
extern int foo;
として宣言し、対応する初期化を単一のソースファイルに入れて、翻訳単位間で共有される変更可能な値を取得します。static const int foo = 42;
を使用して、インライン化できる定数を取得しますグローバル変数の前のstatic
は、この変数が定義されているコンパイルモジュールの外部からアクセスできないことを意味します。
例えば。別のモジュールの変数にアクセスしたいと想像してください:
foo.c
int var; // a global variable that can be accessed from another module
// static int var; means that var is local to the module only.
...
bar.c
extern int var; // use the variable in foo.c
...
var
を静的であると宣言すると、foo.c
がコンパイルされているモジュール以外からはアクセスできません。
モジュールは現在のソースファイルであることに注意してください。plusすべてのインクルードファイル。つまり、これらのファイルを個別にコンパイルし、それらを一緒にリンクする必要があります。
匿名名前空間でのC++の正しいメカニズム。ファイルに対してローカルなものが必要な場合は、静的修飾子ではなく匿名名前空間を使用する必要があります。