我正在使用UnitTest ++框架在我負責的一些C代碼上實現單元測試。最終產品被嵌入並使用const結構來保存配置信息。由於目標主機可以異步修改配置,因此結構的成員都是易失性的。一些結構也被聲明爲不穩定。Volatile關鍵字允許訪問UnitTest ++中的const結構
當我使用const_cast嘗試修改缺少UnitTest Windows 7主機上的volatile關鍵字的結構實例時,出現了分段錯誤。這對我有意義。但是,如果使用volatile關鍵字聲明結構實例,則測試通過。這對我沒有意義。
下面是一個快速代碼示例,顯示了Win7上的gcc問題。切換定義值會導致segfault出現或不出現,具體取決於是否使用了結構的易失性實例。
typedef struct
{
volatile int foo;
volatile int bar;
} TestStruct;
const TestStruct constStruct = { 1, 2};
volatile const TestStruct volatileConstStruct = { 3, 4};
#define SEG_FAULT 0
int main(void)
{
TestStruct * constPtr = const_cast<TestStruct*>(&constStruct);
TestStruct * constVolPtr = const_cast<TestStruct*>(&volatileConstStruct);
#if(SEG_FAULT == 0)
constVolPtr->foo = 10;
#else
constPtr->foo = 20;
#endif
}
任何人都可以幫助我理解爲什麼volatile關鍵字提供了segfault的解決方法嗎?另外,任何人都可以提出一種方法,允許我修改單元測試的結構中的值,而無需將volatile關鍵字添加到所有結構實例中?
編輯:
我剛剛發現,你可以在C這樣做:
#define const
包括有效「常量取消定義」在上面的測試夾具允許我的目標編譯器看const關鍵字並將結構正確放置到閃存中。然而,UnitTest ++編譯器的預處理器去除了const關鍵字,所以我的測試夾具能夠修改結構。
該解決方案的缺點是我不能添加驗證函數調用的正確const操作的單元測試。但是,由於從結構實例中刪除const不是一個選項(需要將數據放在閃存中),這似乎是我必須忍受的一個缺點。
您正在代碼級別混合使用C和C++,而不僅僅是在接口級別上,可能是一個壞主意。這是兩種不同的語言。特別是他們關於什麼是常量的概念和什麼是const限定對象有所不同。 – 2012-01-31 22:08:11
我正在使用需要C++模塊的UnitTest ++來測試C代碼。爲了示例的目的,我將所有混合的C/C++放入同一個文件中(我無法分享正在處理的實際代碼)。在我的環境中,沒有混合的C/C++。 – Egat 2012-01-31 23:25:13