【发布时间】:2018-08-15 01:43:35
【问题描述】:
代码:
void foo() {
extern int a;
extern void b(int);
}
void bar() {
b(9); // ok, warning: use of out-of-scope declaration of 'b'
a=9; // error: use of undeclared identifier 'a'
}
为什么编译器不只是给出像use of out-of-scope declaration of 'a' 这样的警告?
【问题讨论】:
-
@M.M 那么声明在哪里?
-
@M.M:根据
b是否在foo中声明,godbolt.com 上的测试会给出不同的消息。我怀疑 OP 看到的消息的特定原因是函数标识符始终引用模块中的相同函数,因此bar中的b必须 引用相同的b在foo中,但其声明超出范围,而a可以引用不同的对象。 -
@EricPostpischil 你是对的 - 我认为
b在foo中的声明如果它没有被实际调用并不重要,因为声明超出了范围,但事实上这很重要