首先,我會盡力來形容目前的狀況:C++:什麼是定義非類靜態常量值的正確方法?
我適應我們使用一個現有的代碼庫,並在某些情況下的.h/.cpp文件包含多個類定義。我們不能改變API的現有公共接口,而無需對我們現在想避免的其他代碼部分進行重大修改。
我發現需要多個類使用的常量值(在同一個.cpp文件中和其他地方),因此無法定義爲類特定的常量。我知道這樣做的唯一方法是從任何類的外部定義常量(但仍在.cpp文件中)並根據需要引用它們。
我已經完成了這個工作,代碼編譯和鏈接,但是當我去運行代碼上的測試程序時,它會失敗,並顯示與我定義的常量值有關的錯誤。我得到這樣的印象,即代碼執行時,常量沒有被實際定義,並且代碼因此被炸燬。
我沒有很多編寫C++代碼的經驗,也不知道我是否以錯誤的方式來做這件事。我將在下面包含代碼片段,試圖說明我在做什麼。
在DateTime.cpp(目前DateTime.h定義DATE_FORMAT_REGEX什麼):
...
#include <boost/regex.hpp>
static const boost::regex DATE_FORMAT_REGEX("[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])(Z|([+|-]([01][0-9]|2[0-4]):[0-5][0-9]))?");
// Other class method implementations ...
bool our_ns::Date::parse_string(const std::string& s)
{
// Validate string against regex.
bool valid = boost::regex_match(s, DATE_FORMAT_REGEX);
if (valid) {
...
}
}
...
的調用regex_match是什麼失敗。順便說一句,所有的類都是在頭文件的名字空間中定義的。
它會出現該常量未被初始化。我需要做些什麼來初始化這些值?根據我所描述的,有沒有更好的方法來做到這一點?
[更新:6/9/15 12:52 EDT] 實際上,我傳遞了組織中另一位開發人員目擊的信息。他在一個調試器中證實,當他到達爆炸線時,正則表達式項是空的。他還提到,當他做了一些實驗並將定義從.cpp移到.h文件時,錯誤不再發生。除此之外,我不知道事情是否正確執行。
如果你要包含確切的錯誤,這將是最有幫助的。 –
我不知道,如果錯誤信息會有何啓示,但在這裏它是: 斷言失敗:0 = m_pimpl.get(),文件c:\ appsrc \ boost_1_58_0 \提升\正則表達式\ V4 \ basic_regex。 hpp,行617 –
我不知道這是否仍然有趣,但我基本上有完全相同的問題。事實證明,這是一種競爭條件,一個線程可以訪問DATE_FORMAT_REGEX並開始初始化它,然後另一個線程可以在初始化之前使用它。這個錯誤報告描述得很好: [link](https://svn.boost.org/trac/boost/ticket/2854) – DaveM