I'm checking various situations that could happen in declarations with different linkages, and I have 2 questions.
I. I have the following code:
#include <stdio.h>
static int a = 19;
int main(void)
{
extern int a;
{
extern int a;
printf("braces - %d\n", a);
}
printf("main - %d\n", a);
}
which compiles well with both clang
and gcc
, with the same result of 19
being printed in both pritf
s. As i may understand, all a
s are static
as per 6.2.2., 4) of the Standard. The only thing that I don't understand in it is that why file-scope a
is visible for a
in main and braces? Should't the file-scope one be hidden as per footnote 31? When I define the other a
in other file with different value, both printf
s` output is still 19.
II. Now I do the following:
#include <stdio.h>
static int a = 19;
int main(void)
{
int a; //change in this line
{
extern int a;
printf("braces - %d\n", a);
}
printf("main - %d\n", a);
}
gcc
yells variable previously declared ‘static’ redeclared ‘extern’
, while clang
acts normal and prints a
= 0 for a
in main (yes, it is garbage value) and still 19 in braces.
I guess gcc
applies here 6.2.2. 7) of the Standard, while clang
doesn't. Which one's interpretation is correct and what is going on in here?
I can only assume that gcc
''matches'' a
in braces with a
in main (which has no linkage) and makes it's linkage external, and then sees that it conflicts with file-scope static a
. And, once again, why not making braces a
refer to a
in the other file (footnote 31?)?
My current understanding is, in fact, close to the one in the accepted answer in here, even though i do understand that C++ has differences from C (and i ask about C).