【问题标题】:Using _DEBUG Preprocessor Defintion in Visual Studio 2008 - C++在 Visual Studio 2008 中使用 _DEBUG 预处理器定义 - C++
【发布时间】:2011-03-15 21:47:49
【问题描述】:

我有一个使用 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。发布配置没有它。对于每个相应的配置,预期的行显示为灰色(可能表示将编译另一行)。

但是,在运行时,发布构建超时仍然是 INFINITE。当我尝试在两个 if 语句上设置断点并尝试运行 Release 代码时,第一个 if 语句上的断点仍然存在,而另一个断点被移到括号内的第一行。

什么给了?如何使此编译选项起作用?我应该使用别的东西吗?

【问题讨论】:

  • 此代码是存在于 DLL 中还是直接包含在您的主要可执行文件中?
  • 在发布版本中设置断点可能会产生误导。启用优化后,调试器可能会感到困惑。您确定 BAS_THREE_SEC_TIMEOUT 是 3000 而不是更大的值吗?

标签: c++ debugging visual-studio-2008 c-preprocessor


【解决方案1】:

也许是这样的?

#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。检查您的项目预处理器指令以确保这是您所拥有的。

【讨论】:

  • 使用别的东西,WAIT_TIMEOUT 已经被 Windows SDK 使用了。它是超时错误的错误代码,由 WaitForSingleObject 返回的值。哎哟。
  • @Hans yup 忘了这只是一个简单的例子。
【解决方案2】:

这样写并在 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

【讨论】:

  • @BlackBear - 它诊断问题的原因。他无法在不知道为什么会这样的情况下解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多