2012-05-31 148 views
16

爲什麼在匿名命名空間中定義的符號(函數和變量)與static關鍵字具有內部鏈接?如果某個功能在外面不可見/可訪問,那麼有什麼理由進行外部連接?爲什麼匿名命名空間中的函數/對象有外部鏈接?

+0

**他們不**有外部聯繫,但內部。你的來源是什麼? –

+3

可能是C++ 03標準。 –

+0

@SteveJessop匿名命名空間也存在於C++ 03中,並給出內部連接。 –

回答

37

在C++ 03中,具有內部連接的名稱被禁止用作模板參數[*]。因此,無名命名空間中大多數事物的名稱都具有外部鏈接以允許其與模板一起使用。通過聲明static,您可以在未命名的名稱空間中明確給出名稱內部鏈接,與命名空間或全局名稱空間中的相同。

C++ 11中的這兩件事情都改變了 - 默認情況下(3.5/4),未命名名稱空間中的名稱具有內部鏈接,並且可以將具有內部鏈接的名稱用作模板參數。

[*]對於類型,它必須有外部鏈接。對於對象和函數,如果其地址用作模板參數,則它必須具有外部鏈接,儘管可以將其作爲模板參數使用具有內部鏈接的常量整數的

+3

+1,請您可以在答案中添加C++ 11標準中的段落號,表示內部鏈接是默認的? – Klaim

相關問題