extern の次の動作には驚かされます。
これを実行すると
#include<stdio.h>
int main()
{
    extern int a;
    printf("%d\n", a);
    return 0;
}
int a=20;
出力: 20 (gcc Linux 32 ビットでは問題ないようです)
しかし、a内部で変数を宣言するとmain():
#include<stdio.h>
int main()
{
    extern int a;
    int a=20;
    printf("%d\n", a);
    return 0;
}
出力:
extern.c: In function ‘main’:
extern.c:5:9: error: declaration of ‘a’ with no linkage follows extern declaration
extern.c:4:16: note: previous declaration of ‘a’ was here
のスコープをaグローバルからローカルに変更した後、エラーが発生するのはなぜですか?a以前のケースでは許可されていたの再宣言が許可されないのはなぜですか?