Variable Scope in C: Block, Function, File, Prototype
Variable scope in C determines where a declared identifier can be accessed and modified within a program. The C standard recognizes four distinct categories of scope: block scope, function scope, file scope, and function prototype scope. Understanding these boundaries is critical for managing memory, preventing unintended variable shadowing, and controlling the visibility of data across translation units.
Block Scope
Block scope, often referred to as local scope, applies to any
identifier declared inside a pair of curly braces {}. This
includes variables declared within functions, loop bodies, conditional
statements, and standalone nested blocks, as well as the formal
parameters of a function definition.
A variable with block scope is visible only from the point of its
declaration to the closing brace } of the enclosing block.
If a variable is declared inside a nested block with the same name as a
variable in an outer block, the inner variable shadows the outer one
until the inner block terminates. Block-scoped variables without the
static keyword have automatic storage duration, meaning
their memory is allocated when entering the block and deallocated upon
exit.
Function Scope
Function scope applies exclusively to labels used with
goto statements. Unlike ordinary variables, labels are the
only identifiers in C that possess function scope.
A label is visible throughout the entire body of the function in
which it appears, regardless of how deeply nested within blocks it is
placed. A goto statement can jump to a label declared
anywhere inside the same function, even before the label's line of
declaration. However, labels cannot be accessed or jumped to from
outside their containing function.
File Scope
File scope applies to any identifier declared outside of all blocks and parameter lists, commonly known as global variables.
An identifier with file scope is accessible from the point of declaration down to the end of the translation unit (the source file along with all included header files). The visibility of file-scope variables across multiple files depends on their linkage:
- Internal Linkage (
static): Restricts the variable's accessibility exclusively to the source file where it is declared. - External Linkage (
externor default for globals): Allows the variable to be shared across multiple source files by declaring it with theexternkeyword in other translation units.
All file-scope variables possess static storage duration, meaning their memory persists for the entire lifetime of the program.
Function Prototype Scope
Function prototype scope is the narrowest scope in C and applies specifically to parameter names listed inside a function declaration that is not a definition (a prototype).
The scope of a parameter identifier in a prototype begins at its
declaration and terminates at the closing parenthesis ) of
the function prototype. Because the scope ends immediately with the
prototype, the names used for the parameters are purely informational
and are ignored by the compiler. Consequently, parameter names in
prototypes do not conflict with variable names in the surrounding code,
and they can be omitted entirely without affecting the validity of the
declaration.