为什么extern int a; 初始化在本地给出错误但不是全局?

extern int a = 10; // it is not giving error int main () { extern int b = 10; //it is giving error return 0; } 

错误:’b’同时具有’extern’和初始化程序extern int b = 10;

参考C11(N1570)6.7.9 / 5 初始化

如果标识符的声明具有块范围,并且标识符具有外部或内部链接,则声明不应具有标识符的初始化器

规则放在约束部分中,因此任何符合规范的编译器都应该拒绝违反它的代码。

块范围内的extern关键字是从外部范围声明一些现有对象。 声明一个对象并在声明点给它一些其他值是没有多大意义的。

声明外部对象的推荐方法是将其声明放在文件范围(源代码的顶部),因此维护程序员很容易发现和管理它们。