Do all variables declared in a block have 'no linkage'?
For example:
1:
If I declare a static variable:
void foo()
{
static int i;
}
Would it have an internal linkage or no linkage? If no linkage, then why make it static?
2:
What happens if I use extern?
/*global scope*/
static int i;
void foo()
{
extern int i;
}
In this case, what will be the linkage of i
?
Indeed, 'no linkage' at function scope.
The goal is lifetime management: the static has the lifetime of a global static, while it has the visibility (scope) of a local.
Note
In C++ you can also declare statics ('globals') without linkage by enclosing them inside an anonymous namespace. This trick is used commonly in header-only libraries:
If you use extern, the declaration is an
extern
declaration only (nothing is defined). As such, it normally would be expected to external linkage by definition - being defined in another translation unit. (So it acts the same as if when it was declared at global scope). This is similar to local function declarations:Note that, in your
2.
example, variablei
was already declaredstatic
and it will therefore not get external linkage. I might get declared in another translation unit without linker conflicts, though."Would it have internal linkage or no linkage? if no linkage then why make it static?" -- it would have no linkage.
static
specifies the static storage duration."What happens if i use extern?" It will be a declaration of a name with external linkage, and since there is none in global scope, the program will report linkage errors. Edit: Since there is a previous
static
declaration visible in the scope, the standard says the name "receives the linkage of the previous declaration" 3.5/6, so thei
insidefoo()
will have internal linkage.