【发布时间】:2018-08-12 02:57:31
【问题描述】:
代码:
typedef int a; // #1
extern int a; // #2, error
gcc 会产生错误“'a' redeclared as a different kind of symbol”,但是当我们将extern 声明移到块作用域时,不会有警告,为什么?
typedef int a; // #3
void foo() {
extern int a; // #4, ok
}
还有:
char a; // #5
void foo() {
extern int a; // #6, error
}
更新:
感谢@Yunnosch 的回复,但它仍然无法回答我的问题。我们看#6,#5,当编译器看到#6时,它会尝试在文件范围标识符中查找是否存在相同的'a',虽然它们在不同的范围内,但编译器会产生错误。
然后看#4,#3,当编译器看到#4的时候,会发现同样的'a'以同样的方式存在,为什么不报错呢?
@Yunnosch 和@Stargateur 都对不同的范围进行了解释,这显然不是真的。我的观点是它与链接有关,但 #2 无法隐藏 #1 告诉我这也不是真的。
更新 2:
感谢@AnT,他给出了非常详细的解释。
【问题讨论】:
-
你明白
typedef int a;是做什么的吗? -
@Stargateur 它引入了一种类型,我混淆的是这里 extern 的不同行为。
-
这只是允许它的范围。
-
@Stargateur 为什么允许在块范围内?