2017-02-21 57 views
7

[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

回答

1

extern s爲那裏強調各自的意見,指出了extern在某些情況下沒有效果(由於該段中列出的規則)。

在第一示例中,f具有內部連接儘管被宣佈extern,因爲這是第一次在命名空間範圍中聲明static

在第二〔實施例,extern對聲明沒有影響,因爲q也宣佈在命名空間內沒有它(和X::q優先於::q)。

1

我認爲這些例子避開了一些可能會出現的似是而非的錯誤觀點。

在第6人們所預料的f()外部聯動,因爲這是extern「正常」(即在文件範圍內)表示,但它實際上是因爲static聲明的內部聯動進一步上漲。

在第7段有人會想到extern void q();,使q()可用的(或鬆散的講話外部到)p()外面,因此它可以在middle()被調用,但這並不要麼發生。

如果沒有extern這個關鍵字,兩者都是正確的,但對於期望extern意味着不同的人來說,這並不令人驚訝。

相關問題