Использование определения препроцессора _DEBUG в Visual Studio 2008 - C ++ - PullRequest
1 голос
/ 16 марта 2011

У меня есть приложение VC ++, написанное с использованием Visual Studio 2008. В целях отладки значения тайм-аута компилируются по-разному в зависимости от типа сборки (Debug или Release). Пример кода ниже типичен для того, как я пытаюсь это сделать.

#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 остается, тогда как другая точка останова перемещается на первую строку внутри скобок.

Что дает? Как сделать так, чтобы этот параметр компиляции работал? Должен ли я использовать что-то еще?

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Напишите это так и соберите сборку выпуска:

#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
3 голосов
/ 16 марта 2011

Может быть, что-то вроде этого?

#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. Проверьте директивы препроцессора вашего проекта, чтобы убедиться, что это то, что у вас есть.

...