範囲は、the area in which the object is active
と定義されています。 Cには5つのスコープがあります。以下のとおりです。
プログラムスコープ
これらは、一番上の層で宣言されています。それらはプログラムの寿命まで利用可能です。すべての機能にこのスコープがあります。これは、グローバルスコープとも呼ばれます。
ファイルスコープ
それはファイルの末尾にその時点からアクセスすることができるように範囲を有しています。
void dummy(void) { }
// absence of static automatically gives program scope to `dummy()`
static void dummy(void) { }
// static keyword here gives function `dummy()` a file scope
関数スコープ
のみのラベルはこのスコープを持っています。このスコープでは、それらは機能の最後までアクティブです。
void printFun()
{
print:
printf(“i is less than j”);
}
int main()
{
int i=1,j=2;
if(i < j)
goto print;
}
このコードは、ラベルが唯一の関数スコープを持っているので、レーベル印刷が知られていないことを言って、コンパイラによってエラーフラグを設定します。関数間で無条件にジャンプする必要がある場合は、setjmp
/longjmp
関数を使用する必要があります。(ブロックが{ }
内の文のように定義される)ブロックの終わりまでアクティブで
ブロックスコープ
宣言。関数内の宣言はすべてブロックスコープのみを持ちます。
int fun(int a, int b)
{
int c;
{
int d;
}
// a, b, c, d all have block scope
}
これまで説明したように、機能範囲はラベルにのみ適用されます。ブロックスコープと混同しないでください。関数の引数は、ブロックの先頭に他の変数とともに宣言されているかのように扱われます(関数本体も{ }
内のブロックとみなされます)。したがって、関数引数にはブロックスコープ(関数スコープではありません)があります。
ローカルスコープは、スコープまたはブロックスコープのいずれかを参照する一般的な使用法です。
プロトタイプスコープ
これらのみプロトタイプ宣言内部スコープを備えています。このスコープは、変数名がプロトタイプの宣言でのみ有効で、他の変数名と競合しないので興味深い。それは非常にわずかな時間のために存在し、あまり使用されないので、気づかれなくなります。ここで
int add(int a, float b);
変数a
とb
はプロトタイプのスコープを持っていると言われています。
名前を解決する必要があるは、その名前が最小限の範囲で検索し、それが利用できない場合、それはスコープの高いレベルで検索される最小限の範囲を選択します。したがって、変数を宣言する必要がある場合は、可能な限り最小限のスコープを選択する必要があります。スコープを制限することができれば、プログラムの効率、可読性、保守性が向上します。ブロック外で有用でない変数が必要な場合は、ブロック内で宣言し、外側の変数では宣言しないでください。同様に、関数内でのみ値がアクセスされるが、関数呼び出しの間では値を保持する必要のある変数を使用する場合は、静的変数をグローバル変数に設定します。
非常に徹底的で役立つ議論をありがとう。私は、さまざまなレベルのスコープの正式な名前を認識していませんでした。 – DevNull
@GirLovesTacosもう1つのスコープ - レキシカルスコープがあります! ..それのためのGoogle! :) –