A variable declared globally is said to having program scope
A variable declared globally with static keyword is said to have file scope.
For example:
int x = 0; // **program scope**
static int y = 0; // **file scope**
static float z = 0.0; // **file scope**
int main()
{
int i; /* block scope */
/* .
.
.
*/
return 0;
}
What is the difference between these two?
A variable with file scope is only visible from its declaration point to the end of the file. A file refers to the program file that contains the source code. There can be more than one program files within a large program. Variables with program scope is visible within all files (not only in the file in which it is defined), functions, and other blocks in the entire program. For further info. check this : Scope and Storage Classes in C.
Variables declared as
static
cannot be directly accessed from other files. On the contrary, non-static
ones can be accessed from other files if declared asextern
in those other files.Example:
foo.c
foo.h
main.c
Generally, one should avoid global variables. However, in real-world applications those are often useful. It is common to move the
extern int foo;
declarations to a shared header file (foo.h in the example).C programs can be written in several files, which are combined by a linker into the final execution. If your entire program is in one file, then there is no difference. But in real-world complex software which includes the use of libraries of functions in distinct files, the difference is significant.
In C99, there's nothing called "program scope". In your example variable
x
has a file scope which terminates at the end of translation unit. Variablesy
andz
which are declaredstatic
also have the file scope but with internal linkage.Also, the variable
x
has an external linkage which means the namex
can is accessible to other translation units or throughout the program.