I wonder about the use of the static
keyword as scope limiting for variables in a file, in C.
The standard way to build a C program as I see it is to:
static
.I see two reasons for declaring a gobal as static
, if the variable is not published in the h file anyway:
extern
. I suppose that the linker would dislike a variable being both extern
and static
. (I dislike the idea of a file redeclaring a variable owned by someone else as extern
, is it ok practice?)Any other reason?
Same goes for static
functions. If the prototype is not published in the h file, other files may not use the function anyway, so why define it static
at all? I can see the same two reasons, but no more.
You should consider making a method static in Java : 1) If a method doesn't modify the state of the object, or not using any instance variables. 2) You want to call the method without creating an instance of that class.
Unlike global functions in C, access to static functions is restricted to the file where they are declared. Therefore, when we want to restrict access to functions, we make them static. Another reason for making functions static can be reuse of the same function name in other files.
Declaring a function as static prevents other files from accessing it. In other words, it is only visible to the file it was declared in; a "local" function. You could also relate static (function declaration keyword, not variable) in C as private in object-oriented languages.
When you talk about informing other readers, consider the compiler itself as a reader. If a variable is declared static
, that can affect the degree to which optimizations kick in.
Redefining a static
variable as extern
is impossible, but the compiler will (as usual) give you enough rope to hang yourself.
If I write static int foo;
in one file and int foo;
in another, they are considered different variables, despite having the same name and type - the compiler will not complain but you will probably get very confused later trying to read and/or debug the code. (If I write extern int foo;
in the second case, that will fail to link unless I declare a non-static int foo;
somewhere else.)
Global variables rarely appear in header files, but when they do they should be declared extern
. If not, depending on your compiler, you risk that every source file which includes that header will declare its own copy of the variable: at best this will cause a link failure (multiply-defined symbol) and at worst several confusing cases of overshadowing.
By declaring a variable static
on file level (static
within function has a different meaning) you forbid other units to access it, e.g. if you try to the variable use inside another unit (declared with extern
), linker won't find this symbol.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With