2011-03-15 107 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

相关问题