If I have a C file like below, what is the difference between i
and j
?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
If I have a C file like below, what is the difference between i
and j
?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
i
has internal linkage so you can't use the namei
in other source files (strictly translation units) to refer to the same object.j
has external linkage so you can usej
to refer to this object if you declare itextern
in another translation unit.Scope of static variable/function is within the same file despite you include the file as part of a different source file.
Scope of global variable is throughout the files in which it is included. To include the variable in a different source file, we use
extern
before the variable declaration. No memory is allocated again for the variable in this case.extern
is used to declare a C variable without defining it.extern
keyword extends the visibility of the C variables and C functions. Since functions are visible through out the program by default, the use ofextern
is not needed in function declaration/definition. Its use is redundant.i
will have static linkage, i.e., the variable is accessible in the current file only.j
should be defined asextern
, that isin another header file (
.h
), and then it will have external linkage, and can be accessed across files.The difference is that
i
has internal linkage, andj
has external linkage. This means you can accessj
from other files that you link with, whereasi
is only available in the file where it is declared.i
is not visible outside the module;j
is globally accessible.That is, another module, which is linked to it, can do
and then be able to read and write the value in
j
. The same other module cannot accessi
, but could declare its own instance of it, even a global one—which is not visible to the first module.