Search code examples
cvariablesscopeglobal-variableslocal-variables

How to globaly initialize variable in c and what is the difference between static and extern?


please explain me about how a variable scope can be globally initialized in C and what is the difference between static and extern


Solution

  • The scope of variable means: Where can it be seen (aka where does it exist) and thereby be accessed.

    The scope of a variable depends on where in the code it is defined.

    A variable gets global scope when it is defined outside a function. The keyword static can limit the scope of a global variable so that it can only be seen in that particular c-file (aka compilation unit). So:

    file1.c

    int gInt1;         // Global variable that can be seen by all c-files
    
    static int gInt2;  // Global variable that can be seen only by this c-file
    
    void foo(void)
    {
        int lInt;  // Local variable 
    
        ...
    }
    

    In order to use a global variable from another c-file, you tell the compiler that it exists in some other file. For this you use the extern keyword.

    file2.c

    extern int gInt1;  // Now gInt1 can be used in this file
    
    void bar(void)
    {
        int n = gInt1 * (gInt1 + 1);
    
        ...
    }
    

    You often put the extern declaration into a header file. Like:

    file1.h

    extern int gInt1;  // Any c-file that includes file1.h can use gInt1
    

    file2.c

    #include "file1.h" // Now gInt1 can be used in this file
    
    void bar(void)
    {
        int n = gInt1 * (gInt1 + 1);
    
        ...
    }
    

    Regarding initialization

    Initializing a global variable is no different from initializing a local variable.

    The only difference between global and local variables is when you do not have an initializer. In such cases a local variable will be left uninitialized while global variables will be default initialized (which typically means initialized to zero).

    file1.c

    int gInt1 = 42;         // Global variable explicit initialized to 42
    
    int gInt2;              // Global variable default initialized to 0
    
    void foo(void)
    {
        int lInt1 = 42;     // Local variable explicit initialized to 42
    
        int lInt2;          // Local variable uninitialized. Value is ??
        ...
    }