[英]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.