2012-01-11 4 views
2

次のタイプのCコードには特定の用語がありますか?私の例では、不必要なif/else/forステートメントを使用することなく、同じ名前の変数を複数回再宣言できるように、関数内の小さなコード塊のスコープの深さを増やしたいと考えています。例えば:用語定義 - Cアプリケーションのスコープ

void myfunc(void) { 
    int a = 0, b = 1; 
    { 
    int c; 
    c = 3; 
    printf("c is: %d", c); 
    } 

    a = 2; 
    { 
    int c = 5; 
    printf("c is %d", c); 
    } 

} 

機能の残りの部分は、「C」int型を見ていないので、私は中括弧でいくつかのコードを包み、スコープの深さを増加させた方法を記述するために使用される用語とは何ですか?

ありがとうございます!

答えて

4

範囲は、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); 

変数abはプロトタイプのスコープを持っていると言われています。

名前を解決する必要があるは、その名前が最小限の範囲で検索し、それが利用できない場合、それはスコープの高いレベルで検索される最小限の範囲を選択します。したがって、変数を宣言する必要がある場合は、可能な限り最小限のスコープを選択する必要があります。スコープを制限することができれば、プログラムの効率、可読性、保守性が向上します。ブロック外で有用でない変数が必要な場合は、ブロック内で宣言し、外側の変数では宣言しないでください。同様に、関数内でのみ値がアクセスされるが、関数呼び出しの間では値を保持する必要のある変数を使用する場合は、静的変数をグローバル変数に設定します。

+0

非常に徹底的で役立つ議論をありがとう。私は、さまざまなレベルのスコープの正式な名前を認識していませんでした。 – DevNull

+0

@GirLovesTacosもう1つのスコープ - レキシカルスコープがあります! ..それのためのGoogle! :) –

2

私はあなたが新しいローカルスコープ、またはネストされたスコープ、またはブロックを導入していると思います。

あなたはこれを積極的に活用する際にこれがC++で真剣に重要になってくる

{ 
    std::lock_guard<std::mutex> lk(my_mutex); 

    do_critical_stuff(); // might throw exception? 
} 
// the lock is released automagically! 

をしかし、彼らが必要としているところも、Cでそれがローカルでのみ使用する変数には良い習慣だと、不必要に広いスコープにそれらを出血ではありません。

+0

"新しいローカルスコープの紹介"は、私が探していたフレーズです。ありがとう! – DevNull

0

用語はの範囲です。

K &名も、

スコープ語で知られ たプログラムの領域である範囲を有する

としてR2がワード スコープを定義これは識別子の可視性を指します。

関連する問題