Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
13 / 12 / 9
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
1

NDEBUG и DEBUG

30.08.2013, 19:45. Просмотров 6134. Ответов 7
Метки нет (Все метки)

зачем нужны константы NDEBUG и DEBUG??

спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2013, 19:45
Ответы с готовыми решениями:

NDEBUG
"С++ позволяет программисту "удалить" проверки в окончательной версии программы, просто определив...

DEBUG
5. Имеется следующая программа в машинных кодах: b0 25 d0 e0 b3 15 f6 e3 cb ...

Debug
Здравствуйте! Подскажите, а есть ли у студии инструмент watch как у борланда для просмотра значений...

Debug
почему не запускается отладчик debug?

7
Ушел с форума
Эксперт С++
16406 / 7381 / 1184
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
30.08.2013, 19:51 2
Это не константы, это препроцессорные определения.
Когда приложение собирается в отладочной конфигурации, среда
задает для него макрос DEBUG. Когда в релизной - макрос NDEBUG.
Это позволяет создавать код, который, например, есть только в
отладочной версии и отсутствует в релизной. Например, assert.
2
13 / 12 / 9
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
30.08.2013, 19:55  [ТС] 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
//макрос подтверждения
#include <cassert>
 
#define NDEBUG
 
int main()
{
    int x=11;
    _set_abort_behavior( 0, _WRITE_ABORT_MSG);
 
    assert(x<=10);//вызовет функцию abort() так как x>10;
    cout<<endl;
 
 
    return 0;
}
если я понял правильно то определение
C++
1
#define NDEBUG
должно выключить:
C++
1
assert(x<=10);//вызовет функцию abort() так как x>10;
0
Ушел с форума
Эксперт С++
16406 / 7381 / 1184
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
30.08.2013, 20:01 4
NDEBUG не отключает DEBUG.
Эти макросы лучше не изменять и не определять вручную, за
это отвечает среда (Visual Studio, например).
0
Эксперт С++
5811 / 3462 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
30.08.2013, 20:41 5
Эти макрос NDEBUG обычно определяется системой сборки (можно и определить вручную). Если он определён к моменту, когда подключается заголовочный файл assert.h (соответственно, cassert для C++), то макрос assert не генерирует кода.

Также ты можешь использовать этот макрос, к примеру, для написания собственных макросов:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef DEBUG_H
#define DEBUG_H
 
#ifdef NDEBUG
 
#define DEBUG(FMT, ...) ((void) 0)
#define ASSERT(TEST, FMT, ...) ((void) 0)
 
#else
 
#include <stdio.h>
#include <stdlib.h>
 
#define DEBUG(FMT, ...)                         \
    fprintf(stderr, "[DEBUG] " FMT "\n", ##__VA_ARGS__)
 
#define ASSERT(TEST, FMT, ...)                              \
    do                                                      \
    {                                                       \
        if(!(TEST))                                         \
        {                                                   \
            DEBUG("Assertion \"" #TEST "\" failed: "        \
                  FMT, ##__VA_ARGS__);                      \
            abort();                                        \
        }                                                   \
    } while(0)
 
#endif  /* NDEBUG */
 
#endif  /* DEBUG_H */
Также можно его использовать для включения/выключения частей кода в зависимости от режима сборки (отладочная/релизная):
C
1
2
3
4
5
puts("This line will always be displayed.");
 
#ifndef NDEBUG
puts("This line will not be displayed if NDEBUG is defined.");
#endif
если я понял правильно то определение
C
1
#define NDEBUG
должно выключить:
C
1
assert(x<=10);//вызовет функцию abort() так как x>10;
Во-первых, это определение должно быть раньше подключения cassert. Во-вторых, как уже сказали, это дело лучше доверить системе сборки/IDE.
1
13 / 12 / 9
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
30.08.2013, 21:10  [ТС] 6
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
 
#define SUM(x,y) cout<<"the sum of x and y is" x+y<<endl;
int main()
{
    SUM(10,10);
    return 0;
}
в макросе нужно сложить x+y что не так?
0
Эксперт С++
5811 / 3462 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
30.08.2013, 21:14 7
slipp1, во-первых, лишняя точка с запятой. Во-вторых, зачем ты используешь # там, где не надо?

C++
1
#define SUM(X, Y) (cout << "the sum of " #X " and " #Y " is " << ((X) + (Y)) << endl)
1
13 / 12 / 9
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
30.08.2013, 21:17  [ТС] 8
нужно отдохнуть. спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2013, 21:17

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Debug в W7
в Windows 7 нет debug, все лабораторные дали в debug, какой аналог можно выбрать или как запустить...

RELEASE и DEBUG
День Добрый! Такая проблемка: есть проект в Visual C++ 2010, вообщем, проект не собирается в...

Debug в CoIDE
Доброго времени суток. Подскажите пожалуйста, есть ли возможность во время отладки увидеть...

Debug на андроиде
Здравствуйте. Как вы думаете, с помощью debug можно узнать как будет загружаться процессор (и ОП) в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.