簡體   English   中英

在C ++命名空間中,當在標頭中聲明的非成員子例程加上前綴時,“ static”限定符是否有效?

[英]In a C++ namespace does the `static` qualifier have any effect when prefixing non-member subroutines declared in the header?

考慮:

namespace JohnsLib {
    static bool foobar();
    bool bar();
}

static在這里有什么含義?

它將鏈接從“外部”更改為“靜態”,從而使鏈接器看不見它,並且其他編譯單元無法使用它。 (好吧,如果其他編譯單元也包含標頭,它們將獲得自己的單獨副本)

命名空間范圍內的static表示它是翻譯單元(即源文件)本地的。 如果您在頭文件中定義函數並將該頭文件包含到多個C ++文件中,則不會出現重新定義錯誤,因為所有函數都是唯一的(更正確的說,這些函數將具有內部鏈接 )。 可以通過匿名名稱空間來實現相同的效果,例如

namespace JohnsLib
{
    namespace
    {  
         bool foobar() {definition here, won't cause redefinition errors}
    }
    bool bar();
}

名稱空間范圍(全局或用戶定義的名稱空間)中static關鍵字的結果是此類定義對象將沒有外部鏈接; 也就是說,它將不能從其他翻譯單元獲得,也不能用作(非類型之一,即引用或指針)模板參數。

在C ++編程語言Bjarne指出的C和C ++程序中,

關鍵字static (令人困惑)用來表示“使用內部鏈接”。 除內部函數和類外,不要使用靜態

在Sutter / Alexandrescu C ++編碼標准中,項目61為“不要在頭文件中定義具有鏈接的實體”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM