static
can be confusing with the wrong definition. Here's a simplified example:
The task is to write a counter
function that takes no arguments and returns a different number each time, starting at 0
and adding 1
each time.
int current_counter = 0;
int counter(void) {
return current_counter++;
}
Now imagine someone is using this library. They write a function called counter
just for testing. But when they try to link their code, it fails, telling them that counter
is being redefined. But no worry, We are C programmers and we have static
at our disposal!
Many believe static to have multiple meanings in C.
- static functions are not exported globally
- static local variables are hidden globals
- static global variables are not exported globally What could have caused this mess of keyword overloading?
The answer lies in a shift of perspective. static
means compilation unit local. A compilation unit in C is just the files given to the c compiler (gcc, clang, msvc, etc) and what they #include
.
Using this definition we can say the following.
- static functions are owned by the compilation unit
- static global variables are owned by the compilation unit
- static local variables are owned by the compilation unit
Using this knowledge, we can rewrite the counter function to not leak counter
into the API.
First, move current_counter
into a static in counter
int counter(void) {
static int current_counter = 0;
return current_counter++;
}
This will make current_counter
not collide with anything else named current.
Next is to make counter
a static function
static int counter(void) {
static int current_counter = 0;
return current_counter++;
}
This will make counter
not visible to files not in the same compilation unit.
Now things are fixed! The counter
function and current_counter
variable cannot be used in files not in the same compilation unit.
I hope this helped someone.
Oldest comments (2)
I really like this interpretation! Unfortunately I already had to learn this the hard way.
I think the additional tiered levels of local/global adds to the confusion, you ran into it yourself when saying that static global variables are not (exported) global.
C can be confusing to get into, but once you get used to it, it can be refreshingly simple. Hopefully this helps someone out!
The correct term is translation unit. Hence, in C,
static
actually means primarily:If it's a
static
variable (as opposed to a function), then it also means:main()
.