我正在寫一個庫,並希望儘可能以C++爲中心,記住舊的諺語「宏是邪惡的」。C++字符串常量和靜態變量初始化(或只是使用宏?)
在源文件中,我有以下定義:
const std::string DATA_DIR_ENV_STR = "DATADIR"
const std::string DFLT_DATA_DIR = "../data"
/*
#define DATA_DIR_ENV_STR "DATADIR"
#define DFLT_DATA_DIR "../data"
*/
std::string getRootDirectory()
{
char * datastr_ = getenv(DATA_DIR_ENV_STR);
if (datastr_)
return std::string(datastr_);
return DFLT_DATA_DIR;
}
//頭文件
std::string getRootDirectory();
我當時已經陷入這樣的初始化一個單例類:
bool mySingleton::inited = mySingleton::initialize();
bool mySingleton::initialize(){
std::string rootdir = getRootDirectory(); // <-SEGV when using const std::string
}
庫編譯得很好,但是當我將應用程序鏈接到它時,應用程序始終是SEGV'd。我使用gdb來追蹤這個問題,並且發現我的震驚/恐怖,字符串變量DATA_DIR_ENV_STR和DFLT_DATA_DIR在靜態變量初始化期間被訪問時尚未初始化。
最後我簡單地用宏來解決這個問題。但是,我不禁想知道,這是'靜態變量初始化失敗'的變體嗎?有沒有另一種方法來解決這個問題,而不使用宏?
如果你使用一個單身,那麼你得到你所支付的。 – Puppy 2011-02-07 16:44:14