7

機能範囲 とはどういう意味ですか?

変数の範囲を理解しています。関数のスコープについて話すとき、それは構造体 (クラス) 内の関数を指すのmain()でしょうか、それとも C/C++ プログラムで呼び出す通常の関数のスコープがあるのでしょうか?

4

4 に答える 4

8

大まかに言えば、スコープは名前を宣言できる領域です。スコープで宣言された名前は、そのスコープ内でアクセスでき、状況によっては外部からもアクセスできます。

(厳密に言うと、これは実際には宣言領域であり、名前のスコープは名前が有効なプログラムの一部です。名前は宣言された場所から始まり、その領域の残りの部分と、場合によっては一部の領域が含まれます。他の地域。)

スコープは、名前空間、クラス、および複合ステートメント (つまり、 で囲まれたコード ステートメントのブロック{}) によって導入されます。最後のものには、関数の本体が含まれます。

ほとんどのオブジェクトと関数には名前があり、これらの名前はそれぞれスコープ内にあります。

そのため、「関数のスコープ」は 2 つのことを意味する可能性があります。ローカル変数が宣言されている関数の本体によって定義されたスコープ。または、関数名が宣言されているスコープ (クラスまたは名前空間)。

更新: 関数名の範囲を意味すると言います。これは常に宣言の直後に始まります。どこで終了するかは、その宣言がどこにあったかによって異なります。

  • 名前空間内で宣言されている場合、その名前空間が閉じられるまで存続します。名前空間が後で同じ翻訳単位で再度開かれると、そこでスコープに戻ります。
  • クラス定義内でメンバー関数として宣言されている場合、スコープはクラス定義の終わりまで続きます。また、派生クラスの定義内、およびそのクラスまたは派生クラスのメンバーの定義内でも有効です。
  • クラス定義内でフレンドとして宣言されている場合、または関数定義内で宣言されている場合、名前は実際には周囲の名前空間で宣言されており、スコープはその場合と同じです。
于 2012-07-05T13:52:10.073 に答える
7

関数は、グローバル、名前空間、クラス (通常、その場合はメンバーと呼ばれます)、またはローカル (別の関数内) スコープを持つことができます。またstatic、内部リンケージまたは匿名の名前空間内で、翻訳単位の外部からアクセスできないようにすることもできます (ただし、テンプレート パラメーターとして使用できるように外部リンケージは保持されます)。

于 2012-07-05T13:50:48.120 に答える
3

はい、関数にもスコープがありますが、そのスコープは通常、ほとんどの変数のスコープよりも大きくなります。

C [編集: これを書いたときのタグの 1 つでした] では、関数にはグローバル スコープまたはファイル スコープのいずれかがあります。グローバル スコープは、プログラム全体で表示される通常の関数に適用されます。ファイル スコープは、「静的」としてマークした関数に適用されるため、同じ翻訳単位内でのみ表示されます。

C++ ではこれらに若干異なる名前が使用されていますが、基本的な概念は同じです。実際に「名前空間」およびstructs/ classes という名前の形式で名前空間を追加します。1 つの例外を除いて、名前空間内の関数はその名前空間内でのみ表示されます。例外は、 /friend内で関数を定義する場合です。classstruct

class X {
    friend void whatever(X const &) { do_something(); }
};

この場合、関数が の内部で定義されていてもX、その名前は周囲の名前空間に注入されるため、X の外部から見えるようになります。

于 2012-07-05T13:54:05.840 に答える
1

ここで意味しているのは、ラベル(ラベルgotoはステートメントで使用するものです) が表示される範囲だと思います。

この記事は、スコープを理解するのにも役立つかもしれません。また、stackoverflowでこの質問を見ることもできます。

于 2012-07-05T13:50:10.010 に答える