diff options
Diffstat (limited to 'devdocs/c/language%2Fscope.html')
| -rw-r--r-- | devdocs/c/language%2Fscope.html | 128 |
1 files changed, 0 insertions, 128 deletions
diff --git a/devdocs/c/language%2Fscope.html b/devdocs/c/language%2Fscope.html deleted file mode 100644 index 654166df..00000000 --- a/devdocs/c/language%2Fscope.html +++ /dev/null @@ -1,128 +0,0 @@ - <h1 id="firstHeading" class="firstHeading">Scope</h1> <p>Each <a href="identifier" title="c/language/identifier">identifier</a> that appears in a C program is <i>visible</i> (that is, may be used) only in some possibly discontiguous portion of the source code called its <i>scope</i>.</p> -<p>Within a scope, an identifier may designate more than one entity only if the entities are in different <a href="name_space" title="c/language/name space">name spaces</a>.</p> -<p>C has four kinds of scopes:</p> -<ul> -<li> block scope </li> -<li> file scope </li> -<li> function scope </li> -<li> function prototype scope </li> -</ul> <h3 id="Nested_scopes"> Nested scopes</h3> <p>If two different entities named by the same identifier are in scope at the same time, and they belong to the same <a href="name_space" title="c/language/name space">name space</a>, the scopes are nested (no other form of scope overlap is allowed), and the declaration that appears in the inner scope hides the declaration that appears in the outer scope:</p> -<div class="c source-c"><pre data-language="c">// The name space here is ordinary identifiers. - -int a; // file scope of name a begins here - -void f(void) -{ - int a = 1; // the block scope of the name a begins here; hides file-scope a - { - int a = 2; // the scope of the inner a begins here, outer a is hidden - printf("%d\n", a); // inner a is in scope, prints 2 - } // the block scope of the inner a ends here - printf("%d\n", a); // the outer a is in scope, prints 1 -} // the scope of the outer a ends here - -void g(int a); // name a has function prototype scope; hides file-scope a</pre></div> <h3 id="Block_scope"> Block scope</h3> <p>The scope of any identifier declared inside a <a href="statements#Compound_statements" title="c/language/statements">compound statement</a>, including function bodies, <span class="t-rev-inl t-since-c99"><span>or in any expression, declaration, or statement appearing in <a href="if" title="c/language/if">if</a>, <a href="switch" title="c/language/switch">switch</a>, <a href="for" title="c/language/for">for</a>, <a href="while" title="c/language/while">while</a>, or <a href="do" title="c/language/do">do-while</a> statement</span><span><span class="t-mark-rev t-since-c99">(since C99)</span></span></span>, or within the parameter list of a <a href="function_definition" title="c/language/function definition">function definition</a> begins at the point of declaration and ends at the end of the block or statement in which it was declared.</p> -<div class="c source-c"><pre data-language="c">void f(int n) // scope of the function parameter 'n' begins -{ // the body of the function begins - ++n; // 'n' is in scope and refers to the function parameter -// int n = 2; // error: cannot redeclare identifier in the same scope - for(int n = 0; n<10; ++n) { // scope of loop-local 'n' begins - printf("%d\n", n); // prints 0 1 2 3 4 5 6 7 8 9 - } // scope of the loop-local 'n' ends - // the function parameter 'n' is back in scope - printf("%d\n", n); // prints the value of the parameter -} // scope of function parameter 'n' ends -int a = n; // Error: name 'n' is not in scope</pre></div> <table class="t-rev-begin"> <tr class="t-rev t-since-c99"> -<td> <p>Until C99, selection and iteration statements did not establish their own block scopes (although if a compound statement was used in the statement, it had its usual block scope):</p> -<div class="c source-c"><pre data-language="c">enum {a, b}; -int different(void) -{ - if (sizeof(enum {b, a}) != sizeof(int)) - return a; // a == 1 - return b; // b == 0 in C89, b == 1 in C99 -}</pre></div> </td> <td><span class="t-mark-rev t-since-c99">(since C99)</span></td> -</tr> </table> <p>Block-scope variables have <a href="storage_duration" title="c/language/storage duration">no linkage</a> and <a href="storage_duration" title="c/language/storage duration">automatic storage duration</a> by default. Note that storage duration for non-VLA local variables begins when the block is entered, but until the declaration is seen, the variable is not in scope and cannot be accessed.</p> -<h3 id="File_scope"> File scope</h3> <p>The scope of any identifier declared outside of any block or parameter list begins at the point of declaration and ends at the end of the translation unit.</p> -<div class="c source-c"><pre data-language="c">int i; // scope of i begins -static int g(int a) { return a; } // scope of g begins (note, "a" has block scope) -int main(void) -{ - i = g(2); // i and g are in scope -}</pre></div> <p>File-scope identifiers have <a href="storage_duration" title="c/language/storage duration">external linkage</a> and <a href="storage_duration" title="c/language/storage duration">static storage duration</a> by default.</p> -<h3 id="Function_scope"> Function scope</h3> <p>A <a href="statements#Labels" title="c/language/statements">label (and only a label)</a> declared inside a function is in scope everywhere in that function, in all nested blocks, before and after its own declaration. Note: a label is declared implicitly, by using an otherwise unused identifier before the colon character before any statement.</p> -<div class="c source-c"><pre data-language="c">void f() -{ - { - goto label; // label in scope even though declared later -label:; - } - goto label; // label ignores block scope -} - -void g() -{ - goto label; // error: label not in scope in g() -}</pre></div> <h3 id="Function_prototype_scope"> Function prototype scope</h3> <p>The scope of a name introduced in the parameter list of a <a href="function_declaration" title="c/language/function declaration">function declaration</a> that is not a definition ends at the end of the function <a href="declarations" title="c/language/declarations">declarator</a>.</p> -<div class="c source-c"><pre data-language="c">int f(int n, - int a[n]); // n is in scope and refers to the first parameter</pre></div> <p>Note that if there are multiple or nested declarators in the declaration, the scope ends at the end of the nearest enclosing function declarator:</p> -<div class="c source-c"><pre data-language="c">void f ( // function name 'f' is at file scope - long double f, // the identifier 'f' is now in scope, file-scope 'f' is hidden - char (**a)[10 * sizeof f] // 'f' refers to the first parameter, which is in scope -); - -enum{ n = 3 }; -int (*(*g)(int n))[n]; // the scope of the function parameter 'n' - // ends at the end of its function declarator - // in the array declarator, global n is in scope -// (this declares a pointer to function returning a pointer to an array of 3 int)</pre></div> <h3 id="Point_of_declaration"> Point of declaration</h3> <p>The scope of structure, union, and enumeration tags begins immediately after the appearance of the tag in a type specifier that declares the tag.</p> -<div class="c source-c"><pre data-language="c">struct Node { - struct Node* next; // Node is in scope and refers to this struct -};</pre></div> <p>The scope of enumeration constant begins immediately after the appearance of its defining enumerator in an enumerator list.</p> -<div class="c source-c"><pre data-language="c">enum { x = 12 }; -{ - enum { x = x + 1, // new x is not in scope until the comma, x is initialized to 13 - y = x + 1 // the new enumerator x is now in scope, y is initialized to 14 - }; -}</pre></div> <p>The scope of any other identifier begins just after the end of its declarator and before the initializer, if any:</p> -<div class="c source-c"><pre data-language="c">int x = 2; // scope of the first 'x' begins -{ - int x[x]; // scope of the newly declared x begins after the declarator (x[x]). - // Within the declarator, the outer 'x' is still in scope. - // This declares a VLA array of 2 int. -}</pre></div> <div class="c source-c"><pre data-language="c">unsigned char x = 32; // scope of the outer 'x' begins -{ - unsigned char x = x; - // scope of the inner 'x' begins before the initializer (= x) - // this does not initialize the inner 'x' with the value 32, - // this initializes the inner 'x' with its own, indeterminate, value -} - -unsigned long factorial(unsigned long n) -// declarator ends, 'factorial' is in scope from this point -{ - return n<2 ? 1 : n*factorial(n-1); // recursive call -}</pre></div> <p>As a special case, the scope of a <a href="type" title="c/language/type">type name</a> that is not a declaration of an identifier is considered to begin just after the place within the type name where the identifier would appear were it not omitted.</p> -<h3 id="Notes"> Notes</h3> <p>Prior to C89, identifiers with external linkage had file scope even when introduced within a block, and because of that, a C89 compiler is not required to diagnose the use of an extern identifier that has gone out of scope (such use is undefined behavior).</p> -<p>Local variables within a loop body can hide variables declared in the init clause of a <a href="for" title="c/language/for">for</a> loop in C (their scope is nested), but cannot do that in C++.</p> -<p>Unlike C++, C has no struct scope: names declared within a struct/union/enum declaration are in the same scope as the struct declaration (except that data members are in their own <a href="name_space" title="c/language/name space">member name space</a>):</p> -<div class="c source-c"><pre data-language="c">struct foo { - struct baz {}; - enum color {RED, BLUE}; -}; -struct baz b; // baz is in scope -enum color x = RED; // color and RED are in scope</pre></div> <h3 id="References"> References</h3> <ul> -<li> C17 standard (ISO/IEC 9899:2018): </li> -<ul><li> 6.2.1 Scopes of identifiers (p: 28-29) </li></ul> -<li> C11 standard (ISO/IEC 9899:2011): </li> -<ul><li> 6.2.1 Scopes of identifiers (p: 35-36) </li></ul> -<li> C99 standard (ISO/IEC 9899:1999): </li> -<ul><li> 6.2.1 Scopes of identifiers (p: 29-30) </li></ul> -<li> C89/C90 standard (ISO/IEC 9899:1990): </li> -<ul><li> 3.1.2.1 Scopes of identifiers </li></ul> -</ul> <h3 id="See_also"> See also</h3> <table class="t-dsc-begin"> <tr class="t-dsc"> <td colspan="2"> <span><a href="https://en.cppreference.com/w/cpp/language/scope" title="cpp/language/scope">C++ documentation</a></span> for <span class=""><span>Scope</span></span> </td> -</tr> </table> <div class="_attribution"> - <p class="_attribution-p"> - © cppreference.com<br>Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.<br> - <a href="https://en.cppreference.com/w/c/language/scope" class="_attribution-link">https://en.cppreference.com/w/c/language/scope</a> - </p> -</div> |
