機能範囲 とはどういう意味ですか?
変数の範囲を理解しています。関数のスコープについて話すとき、それは構造体 (クラス) 内の関数を指すのmain()
でしょうか、それとも C/C++ プログラムで呼び出す通常の関数のスコープがあるのでしょうか?
大まかに言えば、スコープは名前を宣言できる領域です。スコープで宣言された名前は、そのスコープ内でアクセスでき、状況によっては外部からもアクセスできます。
(厳密に言うと、これは実際には宣言領域であり、名前のスコープは名前が有効なプログラムの一部です。名前は宣言された場所から始まり、その領域の残りの部分と、場合によっては一部の領域が含まれます。他の地域。)
スコープは、名前空間、クラス、および複合ステートメント (つまり、 で囲まれたコード ステートメントのブロック{}
) によって導入されます。最後のものには、関数の本体が含まれます。
ほとんどのオブジェクトと関数には名前があり、これらの名前はそれぞれスコープ内にあります。
そのため、「関数のスコープ」は 2 つのことを意味する可能性があります。ローカル変数が宣言されている関数の本体によって定義されたスコープ。または、関数名が宣言されているスコープ (クラスまたは名前空間)。
更新: 関数名の範囲を意味すると言います。これは常に宣言の直後に始まります。どこで終了するかは、その宣言がどこにあったかによって異なります。
関数は、グローバル、名前空間、クラス (通常、その場合はメンバーと呼ばれます)、またはローカル (別の関数内) スコープを持つことができます。またstatic
、内部リンケージまたは匿名の名前空間内で、翻訳単位の外部からアクセスできないようにすることもできます (ただし、テンプレート パラメーターとして使用できるように外部リンケージは保持されます)。
はい、関数にもスコープがありますが、そのスコープは通常、ほとんどの変数のスコープよりも大きくなります。
C [編集: これを書いたときのタグの 1 つでした] では、関数にはグローバル スコープまたはファイル スコープのいずれかがあります。グローバル スコープは、プログラム全体で表示される通常の関数に適用されます。ファイル スコープは、「静的」としてマークした関数に適用されるため、同じ翻訳単位内でのみ表示されます。
C++ ではこれらに若干異なる名前が使用されていますが、基本的な概念は同じです。実際に「名前空間」およびstruct
s/ class
es という名前の形式で名前空間を追加します。1 つの例外を除いて、名前空間内の関数はその名前空間内でのみ表示されます。例外は、 /friend
内で関数を定義する場合です。class
struct
class X {
friend void whatever(X const &) { do_something(); }
};
この場合、関数が の内部で定義されていてもX
、その名前は周囲の名前空間に注入されるため、X の外部から見えるようになります。