2011-03-15 46 views
1

我有一個使用Visual Studio 2008編寫的VC++應用程序。出於調試目的,根據構建類型(Debug或Release),超時值編譯方式不同。下面的代碼示例是我如何嘗試執行此操作的典型示例。在Visual Studio 2008中使用_DEBUG預處理器定義 - C++

#ifdef _DEBUG 
if ((dwObjectWaitState = ::WaitForSingleObject(m_hValidMsgRxdEvent, INFINITE)) != WAIT_OBJECT_0) 
#else 
if ((dwObjectWaitState = ::WaitForSingleObject(m_hValidMsgRxdEvent, BAS_THREE_SEC_TIMEOUT)) != WAIT_OBJECT_0) 
#endif 
{ 
    /* ... */ 
} 

調試配置在預處理器定義中定義了_DEBUG。發佈配置沒有它。對於每個相應的配置,預期的內線灰顯(大概表示另一條線將被編譯)。

但是,在運行時,發佈版本超時仍爲INFINITE。當我嘗試在兩個if語句上設置斷點並嘗試運行釋放代碼時,第一個if語句上的斷點仍然保留,而另一個斷點則下移到括號內的第一行。

什麼給?我如何使這個編譯選項有效?我應該使用別的東西嗎?

+0

此代碼是否生活在一個DLL或者是直接在主可執行文件的一部分? – Nathanael 2011-03-15 21:54:25

+0

在發佈版本中設置斷點可能會引起誤解。通過優化,調試器可能會被混淆。你確定BAS_THREE_SEC_TIMEOUT是3000而不是更大的? – 2011-03-15 22:29:20

回答

3

也許這樣的事情呢?

#ifdef _DEBUG 
#define NONMS_WAIT_TIMEOUT INFINITE 
#else 
#define NONMS_WAIT_TIMEOUT BAS_THREE_SEC_TIMEOUT 
#endif 

if ((dwObjectWaitState = ::WaitForSingleObject(m_hValidMsgRxdEvent, NONMS_WAIT_TIMEOUT)) != WAIT_OBJECT_0) 
{ 
    /* ... */ 
} 

編輯:在VS中調試構建應該有_DEBUG定義和發佈版本應該定義NDEBUG。檢查你的項目預處理器指令,以確保這是你的。

+0

+1用於刪除代碼重複 – 2011-03-15 22:20:04

+1

使用其他內容,WAIT_TIMEOUT已被Windows SDK使用。它是超時錯誤的錯誤代碼,WaitForSingleObject返回的值。哎喲。 – 2011-03-15 22:35:05

+0

@Hans yup忘了這只是一個簡單的例子。 – AJG85 2011-03-16 16:14:56

3

寫這樣並建立在發佈版本:

#ifdef _DEBUG 
#error Something is really wrong, _DEBUG is still defined 
if ((dwObjectWaitState = ::WaitForSingleObject(m_hValidMsgRxdEvent, INFINITE)) != WAIT_OBJECT_0) 
#else 
if ((dwObjectWaitState = ::WaitForSingleObject(m_hValidMsgRxdEvent, BAS_THREE_SEC_TIMEOUT)) != WAIT_OBJECT_0) 
#endif 
+0

+1對於#錯誤消息:P – AJG85 2011-03-15 22:19:31

+0

這是如何解決他的問題的? – BlackBear 2011-03-15 22:26:38

+0

@BlackBear - 它*診斷問題的原因。如果不知道它爲什麼會這樣,他就解決不了。 – 2011-03-15 22:29:36