2010-01-27 2 views
3

Как предотвратить появление всплывающего окна отладки при сбое утверждения на компьютере под управлением Windows? Приложение, которое я пишу, основано на консоли, и я использую assert() для проверки определенных вещей, когда он выполняется в тестовом режиме. Я использую MinGW + GCC 4.Windows: предотвращение сбоев assert() при открытии всплывающего окна отладки

Редактировать: Это тестовая программа.

#include <stdlib.h> 
#include <assert.h> 

int main(void) { 
    _set_error_mode(_OUT_TO_STDERR); 
    assert(0 == 1); 
    return EXIT_SUCCESS; 
} 

Флаги: gcc -mwindows -pedantic -Wall -Wextra -c -g -Werror -MMD -MP -MF ...

Пробовал без -mwindows, а также. Я все равно получаю всплывающее окно отладки, несмотря ни на что. Это на машине Vista x86.

+0

'Assert()' должны печататься STDERR по умолчанию; всплывающее окно появляется только при компиляции с флагом '-mwindows' ... – Christoph

+0

Я не компилирую с таким флагом. – Ree

ответ

3

Есть много способов, которыми вы можете это сделать. Самым грубым является переопределение макроса assert (см. Заголовок assert.h). Вы также можете позвонить (что я бы посоветовал):

_set_error_mode (_OUT_TO_STDERR); 

Edit: Действительно, это работает для меня:

#include <stdlib.h> 
#include <assert.h> 

int main (void) 
{ 
    _set_error_mode (_OUT_TO_STDERR); 
    assert (0 == 1); 
    return 0; 
} 

Compile с gcc -mwindows, он не показывает диалоговое окно во время выполнения. Удалите строку с _set_error_mode и отобразите диалоговое окно. Если это не сработает для вас, дайте полный пример.

+0

Не хотите сказать '_OUT_TO_STDERR'? – MSalters

+0

Да, я это сделал. Исправлено, спасибо. –

+0

Это странно. Когда я вызываю функцию в 'main()', я получаю объявление неявной функции и неопределенные макрокоманды. Но у меня есть stdlib.h, и я сам сам проверял декларации - они там. Макрос определяется как '# define_OUT_TO_STDERR 1', а функция -' _CRTIMP int __cdecl __MINGW_NOTHROW _set_error_mode (int); '. Любая идея, почему я получаю ошибки? – Ree

2

Вот что я использую, и это, кажется, работает:

SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); 
+1

Это было решение, которое действительно сработало для меня. Следует добавить, что 'include ' необходимо добавить (работает с MingW). Для меня также 'SEM_NOGPFAULTERRORBOX' было достаточно, чтобы установить с помощью' SetErrorMode'. –

+0

Работал для меня тоже. – vitaut

 Смежные вопросы

  • Нет связанных вопросов^_^