私は学生ですが、CおよびC++のグローバル変数とファイルスコープ変数について混乱しています。両方の視点に違いはありますか?はいの場合、詳しく説明してください。
ファイルスコープを持つ変数には、単一のファイル内の任意の関数またはブロックからアクセスできます。ファイルスコープの変数を宣言するには、ブロックの外側の変数(グローバル変数と同じ)を宣言しますが、staticキーワードを使用します。
static int nValue; // file scoped variable
float fValue; // global variable
int main()
{
double dValue; // local variable
}
ファイルスコープ変数は、使用が宣言されているファイルに制限されていることを除いて、グローバル変数とまったく同じように機能します。
名前にはfile scope
識別子の宣言がブロックの外にある場合。ファイルスコープと内部リンケージを持つ名前は、宣言されたポイントから翻訳ユニットの最後まで表示されます。
Global scope
またはglobal namespace scope
は、プログラムの最も外側の名前空間スコープであり、オブジェクト、関数、タイプ、およびテンプレートを定義できます。識別子の宣言がすべてのブロック、名前空間、およびクラスの外部にある場合、名前にはグローバル名前空間スコープがあります。
例:
static int nValue; // file scoped variable
float fValue; // global variable
int main()
{
double dValue; // local variable
}
続きを読む ここ 。
実際に複数の翻訳単位がある場合、ファイル(翻訳単位)-スコープとグローバルスコープを説明する方がおそらく明確です...
2つのファイルを取得します(互いに含まれていないため、それぞれが独自の翻訳単位です)
other.cpp
float global_var = 1.0f;
static float static_var = 2.0f;
main.cpp
#include <cstdio>
extern float global_var;
//extern float static_var; // compilation error - undefined reference to 'static_var'
int main(int argc, char** argv)
{
printf("%f\n", global_var);
}
したがって、違いは明らかです。
ファイルスコープ:すべてのブロックまたはクラスの外部で宣言された名前には、ファイルスコープがあります。宣言後、翻訳ユニットのどこからでもアクセスできます。静的オブジェクトを宣言しないファイルスコープを持つ名前は、多くの場合、グローバル名と呼ばれます。
C++では、ファイルスコープは名前空間スコープとも呼ばれます。