为什么他们坚持在下面的例子中使用`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突出了大胆的人物上面。或我错过了什么?

+0

@ShafikYaghmour这只是指变量,而不是函数。 – Barry

extern s为那里强调各自的意见,指出了extern在某些情况下没有效果(由于该段中列出的规则)。

在第一示例中,f具有内部连接尽管被宣布extern,因为这是第一次在命名空间范围中声明static

在第二〔实施例,extern对声明没有影响,因为q也宣布在命名空间内没有它(和X::q优先于::q)。

我认为这些例子避开了一些可能会出现的似是而非的错误观点。

在第6人们所预料的f()外部联动,因为这是extern“正常”(即在文件范围内)表示,但它实际上是因为static声明的内部联动进一步上涨。

在第7段有人会想到extern void q();,使q()可用的(或松散的讲话外部到)p()外面,因此它可以在middle()被调用,但这并不要么发生。

如果没有extern这个关键字,两者都是正确的,但对于期望extern意味着不同的人来说,这并不令人惊讶。