2012-12-02 100 views
8

可能重複:
Unnamed/anonymous namespaces vs. static functions靜態和匿名命名空間

這是完全多餘的,或者可能有一個理由這樣做呢?

namespace { 
    static void f() { 
    ... 
    } 
} 
+4

看到這一個,它回答了所有:[未命名/匿名命名空間與靜態函數] [1] [1]:http://stackoverflow.com/questions/154469/unnamed-anonymous-namespaces-vs-static-functions – pbhd

+0

@phbd這裏有一條評論,指出未命名的命名空間仍然得到外部聯繫。你知道嗎?你能解釋一下這意味着什麼嗎? – baruch

+0

@baruch:看到我的回答 - 正如標準中的引述所表明的那樣,這意味着發表該評論的人是錯誤的。 –

回答

3

它對我來說看起來多餘 - 要麼聲明爲靜態,要麼處於匿名名稱空間意味着它具有內部鏈接。

§3.5/ 3:

具有名稱命名空間範圍(3.3.6)具有如果是的名稱內部聯動:
- 變量,函數或函數模板是顯式聲明靜態;

§3.5/ 4:

[...]一個未命名的命名空間或具名命名空間內直接或間接地聲明命名空間具有內部連接。 [...]名稱空間範圍內沒有 上面給出的內部鏈接的名稱與封閉名稱空間具有相同的鏈接,如果它是名稱
- 變量;或
- 一個函數;或

因此,現在它已經有了內部鏈接,因爲它是明確聲明爲靜態的。如果它沒有明確聲明爲靜態的,則它將具有內部鏈接,因爲它是在未命名的名稱空間內聲明的。兩種方式的效果都一樣

請注意,我在這裏關於功能明確答覆 - 有一個幾個模糊的情況下,有一個差異,當你與一個類型的名稱處理(例如,類/結構/聯合)但我不知道任何適用於功能的東西。

就內部聯繫的真正含義而言,這是標準實際上非常直接和清晰的地方之一。這也可能是最好引用的所有三種可能性(3.5節/ 2)的定義:

  1. 當一個名稱有外部鏈接,它表示的實體可以通過名稱從其他翻譯單位或範圍所指來自同一翻譯單位的其他範圍。
  2. 當一個名字有內部鏈接時,它所表示的實體可以被來自同一翻譯單元中其他作用域的名稱引用。
  3. 當名稱有無鏈接時,它表示的實體不能被其他作用域中的名稱引用。

請注意,上面的斜體與標準中的斜體相匹配,這是它的方式來說明這些句子定義了這些短語在標準的其餘部分中的含義。