Section 7.1 of the C++ Standard mentions about ‘extern’ as a storage class specifier.
N3126 – “The extern specifier can be
applied only to the names of variables
and functions. The extern specifier
cannot be used in the declaration of
class members or function parameters.
For the linkage of a name declared
with an extern specifier, see 3.5. [
Note: The extern keyword can also be
used in explicit-instantiations and
linkage-specifications, but it is not
a storage-class-specifier in such
contexts. —end note ]
I understand about this keyword and it’s use in the context of ‘linkage specification’, but I am unable to get a grasp on the use of ‘extern’ as a storage specifier.
- Don’t all ‘extern’ names have static storage duration?
- If Answer to 1 is yes, then why this redundancy? C Compatibility?
externis a storage class specifier. This is just a fact of the language grammar.externhas a number of effects on the semantics of a program depending on where it is used. It doesn’t have the single same effect everywhere. It influences the storage duration and linkage of objects and it also helps determine whether some declarations are also definitions or not.E.g.:
For example, if
Ex1andEx2where at global scope then they would both refer to objects with static storage duration and external linkage. In C++, though, the first would be a definition (tentative definition in C) and the second would not. In this exampleexternhas not changed the storage duration or linkage of the declared object.If
Ex1andEx2occurred in a function body thenawould refer to an object with automatic storage duration and no linkage butbwould refer to an object with external linkage and static storage duration. In this example,externhas affected the meaning of the declaration in both linkage, storage duration and whether or not it is a definition.Finally, in C++, here is an example where the only effect of
externis changing the linkage from internal to external.