2016-01-15 99 views
3

如何定義靜態常量std :: string類變量可以安全地在我的程序中隨處使用?定義靜態常量std :: string類變量

1的方法 - 失敗static initialization order fiasco

文件:Consts.h

namespace constants { 
    struct Consts { 
     static const std::string kVar = "123"; 
    } 
} 

第二個辦法 - 導致複製kVar到每一個翻譯單元我們包括這個頭,從而導致一定義違反規則的原則,並可能導致免費錯誤 - 免費錯誤後使用 - 這是未定義的行爲,如果這個定義被包含到多個cpp文件(我想這樣做,因爲我想要全局共享std :: string常量)。

文件:Consts.h

namespace constants { 
    const std::string kVar = "123"; 
} 

有沒有更好的方法(除使用宏 - 這是全球性的這麼難看的解決方案以及)以安全的方式來定義這種變種?什麼是這種結構最好的實踐證明?

回答

5

的常用方法是聲明靜態常量變量在頭文件,但可以在與正確的初始化一個CPP文件進行定義:

h文件:

namespace constants { 
    struct Consts { 
     static const std::string kVar; 
    } 
} 

cpp文件:

const std::string constants::Consts::kVar = "123"; 

還有一件事,名稱空間「常量」已經暗示了常量..不需要嵌套名爲「Consts」的內部類。鬆開「Consts」並僅使用具有相同技術的名稱空間神遊。

+0

我已經使用名稱空間常量來舉例說明這裏有一些命名空間。 –