我有一个使用Visual Studio 2008编写的VC ++应用程序。出于调试目的,超时值的编译方式不同,具体取决于构建类型(调试或发布)。下面的代码示例是我尝试执行此操作的典型代码。
#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
。 Release配置没有它。对于每个相应的配置,预期的衬里显示为灰色(可能表示将编译另一行)。
但是,在运行时,发布构建超时仍为INFINITE
。当我尝试在两个if
语句上设置断点并尝试运行Release代码时,第一个if
语句上的断点仍然存在,而另一个断点则向下移动到括号内的第一行
是什么给出的?如何使此编译选项有效?我应该使用其他东西吗?
答案 0 :(得分: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。检查您的项目预处理器指令,以确保这是您拥有的。
答案 1 :(得分:3)
像这样编写并构建在Release版本中:
#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