C - scope in C

scope in C, because scope rules determine where a variable or function can be accessed in a program.


1. What is Scope?

Scope = The region of the program where a variable, function, or identifier is visible and can be used.
In C, scope is determined at compile time (static scoping).


2. Types of Scope in C

2.1 Block Scope (Local Scope)

  • A variable declared inside a block { ... } is accessible only within that block.

  • Most local variables are of automatic storage duration (destroyed when the block ends).

Example:

#include <stdio.h>

int main() {
    int x = 10; // block scope inside main
    {
        int y = 20; // scope limited to this inner block
        printf("%d %d\n", x, y);
    }
    // printf("%d", y); // ERROR: y not in scope here
}

2.2 Function Scope

  • Labels (used with goto) have function scope.

  • Once declared, a label is visible throughout the function, even before its declaration.

Example:

void test() {
    goto label;
    label: printf("This works\n");
}

2.3 File Scope (Global Scope)

  • A variable or function declared outside all functions has file scope.

  • It is visible from the point of declaration to the end of the file.

  • If it has external linkage, it can be used in other files via extern.

Example:

int g = 5; // file scope

void func() {
    printf("%d\n", g);
}

2.4 Prototype Scope

  • Parameter names in function prototypes have scope limited to the prototype itself.

  • Mostly for documentation; names are optional.

Example:

void func(int x); // x has prototype scope

3. Storage Class & Scope Relationship

Storage class keywords affect visibility and lifetime:

Storage Class Typical Scope Lifetime Linkage
auto Block Until block ends None
register Block Until block ends None
static (local) Block Entire program None
static (global) File Entire program Internal
extern File Entire program External

4. Scope vs Lifetime

Scope = Where in the code you can access the variable.
Lifetime = How long the variable exists in memory.

Example:

void func() {
    static int counter = 0; // scope = block, lifetime = entire program
    counter++;
    printf("%d\n", counter);
}

5. Shadowing

If a local variable has the same name as a global one, it hides the global in that scope.

Example:

#include <stdio.h>

int x = 5;

int main() {
    int x = 10; // shadows global x
    printf("%d\n", x); // prints 10
}

6. Best Practices

  • Prefer the smallest possible scope for variables.

  • Avoid global variables unless necessary.

  • Use static for internal linkage to hide functions/variables from other files.

  • Be cautious with shadowing; it can cause confusion.


Do you want me to make that?