This article needs additional citations for verification. (June 2022) |
This article is missing information about the use of the static keyword to declare class methods in C++ and Java.(April 2014) |
static
is a reserved word in many programming languages to modify a declaration. The effect of the keyword varies depending on the details of the specific programming language, most commonly used to modify the lifetime (as a static variable) and visibility (depending on linkage), or to specify a class member instead of an instance member in classes.
In the predecessors of C, including BCPL and B, there was already a concept of static storage.[1][2], which meant a storage which is always in existence. However, In B, there wasn't a static
keyword, but there was an extrn
keyword to specify external storage (external to all functions and must be defined outside a function), which is always static, in contrast with auto
keyword, which declared an variable with auto storage - one appears whenever the function is invoked, and disappears when the function is left.[2] All variables must be declared, as one of auto
, extrn
, or implicitly as function arguments.
C was developed as a successor of B, and the static
and register
keyword were added as storage class specifiers, alongside with auto
and extern
, which kept their meaning from B. However, in C, the concept of linkage for variables outside functions was introduced. A C program can be formed by multiple compilation units and linked together to form a complete program, which a variable or a function can be either specified as having internal linkage (visible to its own compilation unit only), or external linkage (visible to the whole program). These keywords specify both the storage duration and linkage as follows:[3]
Storage class | Duration | Linkage |
---|---|---|
extern
|
static (program execution) | external (whole program) |
static
|
static (program execution) | internal (translation unit only) for top-level identifier none for block-scope variables |
auto , register
|
function execution | none |
Every variable and function has one of these storage classes; if a declaration does not specify the storage class, a context-dependent default is used:
extern
for all top-level declarations in a source file,auto
for variables declared in function bodies.So, in C, although the static
keyword, when used on variables, always declare a variable with static storage duration, there are two distinct meanings of the keyword, depending on where it is used:
Therefore, in C, the term "static variable" has two meanings which are easy to confuse:
static
.Variables with storage class extern
, which include variables declared at top level without an explicit storage class, are static
in the first meaning but not the second.
In C++ (not C), the static
keyword can also be used to declare a member variable in a class to have static storage duration as well, independent from the storage duration of the class object itself, and such a variable must be defined outside the class. The effect is that the variable is shared among all class instances, becoming a class member instead of an instance member. When applied to a member function (method), it specifies that the member function operates independently of an instance, which means it can't access any non-static members of the class nor the this
pointer.
The static
keyword is used in many programming languages to specify a local variable to have a lifetime of the whole program, preserved between function invocations, instead of having its own copy for each function invocation as in automatic storage duration, inherited from the usage in C.
Examples of programming languages which support the usage of static
keyword for local variables to be kept across invocation include such as C, C++, Objective-C, C#, PHP.
The following programming languages with C-like syntax do not support static
local variables as in C: Java, JavaScript, Dart. In these languages, a variable which is kept for the whole program execution needs to be declared outside functions.
The static
keyword in C, when used as a top-level declaration, makes the variable or function visible to its own compilation unit only. Modern programming languages generally uses namespaces to avoid name clashes, so this use isn't widely adopted apart from programming languages with C compatibility in mind (e.g. C++, Objective-C). Other programming languages which support visibility declarations at top-level use a variety of other keywords to specify different level of visibility, for example, public
in Java for classes which can be used everywhere, or internal
/ file
in C#.[4]
The static
keyword is used in most programming languages with classes to specify a member to be a class member, instead of an instance member, inherited from the usage of C++.
A static member of a class has the following characteristics:
this
reference for the current instance.Some programming languages even go further, allowing the use of static
keyword in other places in a class declaration or usage, for example:
this
reference to the outer class object and must exist in the context of an outer class instance. By declaring an inner class to be static
, it does not carry such a reference and can be used independently to an outer class instance.static
keyword can be used in place of an actual class name to access static members to provide class-level polymorphism, called late static bindings[5]The static
keyword can be used in some programming languages on anonymous functions to prevent capturing states which are captured by default. It is similar to static local variables and static class members in the sense that a static closure does not depend on the running invocation of the containing function.
$this
reference automatically bound to it, the static
keyword prevents this.static
keyword specifies that no outside states to be captured.[6]