extern Storage-Class Specifier
A variable declared with the extern
storage-class specifier is a reference to a variable with the same name defined in another source file. It is used to make the external-level variable definition visible. A variable declared as extern
has no storage allocated for itself; it is only a name.
Example
This example illustrates internal- and external-level declarations:
// Source1.c
int i = 1;
// Source2. c
#include <stdio.h>
// Refers to the i that is defined in Source1.c:
extern int i;
void func(void);
int main()
{
// Prints 1:
printf_s("%d\n", i);
func();
return;
}
void func(void)
{
// Address of global i assigned to pointer variable:
static int *external_i = &i;
// This definition of i hides the global i in Source.c:
int i = 16;
// Prints 16, 1:
printf_s("%d\n%d\n", i, *external_i);
}
In this example, the variable i
is defined in Source1.c with an initial value of 1. An extern
declaration in Source2.c makes 'i' visible in that file.
In the func
function, the address of the global variable i
is used to initialize the static
pointer variable external_i
. This works because the global variable has static
lifetime, meaning its address does not change during program execution. Next, a variable i
is defined within the scope of func
as a local variable with initial value 16. This definition does not affect the value of the external-level i
, which is hidden by the use of its name for the local variable. The value of the global i
is now accessible only through the pointer external_i
.