为什么他们坚持在下面的例子中使用`extern`说明符?
问题描述:
[basic.link]/6(我emphasiss):为什么他们坚持在下面的例子中使用`extern`说明符?
块范围声明的函数的名称和块范围extern声明声明的变量名具有联动。
...
static void f();
static int i = 0;
void g() {
extern void f(); // internal linkage
int i; // #2 i has no linkage
{
extern void f(); // internal linkage <--
extern int i; // #3 external linkage
}
}
[basic.link]/7:...
namespace X {
void p() {
q(); // error: q not yet declared
extern void q(); // q is a member of namespace X <--
}
void middle() {
q(); // error: q not yet declared
}
void q() { /* ... */ } // definition of X::q
}
void q() { /* ... */ } // some other, unrelated q
的extern
符由箭头指出不是必需的,给出的很第一句子段落[basic.link]/6突出了大胆的人物上面。或我错过了什么?
答
的extern
s为那里强调各自的意见,指出了extern
在某些情况下没有效果(由于该段中列出的规则)。
在第一示例中,f
具有内部连接尽管被宣布extern
,因为这是第一次在命名空间范围中声明static
。
在第二〔实施例,extern
对声明没有影响,因为q
也宣布在命名空间内没有它(和X::q
优先于::q
)。
答
我认为这些例子避开了一些可能会出现的似是而非的错误观点。
在第6人们所预料的f()
有外部联动,因为这是extern
“正常”(即在文件范围内)表示,但它实际上是因为static
声明的内部联动进一步上涨。
在第7段有人会想到extern void q();
,使q()
可用的(或松散的讲话外部到)p()
外面,因此它可以在middle()
被调用,但这并不要么发生。
如果没有extern
这个关键字,两者都是正确的,但对于期望extern
意味着不同的人来说,这并不令人惊讶。
@ShafikYaghmour这只是指变量,而不是函数。 – Barry