Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
slipp1
13 / 12 / 1
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
#1

NDEBUG и DEBUG - C++

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

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

спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2013, 19:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос NDEBUG и DEBUG (C++):

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

С++ Debug Error!( - C++
Здравствуйте. Первый раз сталкиваюсь с подобными проблемами. Код работает верно, так как я и хотел. Проблема в том , что после...

debug error - C++
Здравствуйте, уважаемые программисты. Следующая проблема: после добавления блока if(round == 'g') и после запуска программы выдает...

Debug-ошибка - C++
Есть итератор, который ходит по графу в ширину или глубину Функция begin() Iterator <Classofvertex> begin() { ...

Release/Debug - C++
Здравствуйте! Пишу сложную расчётную программу. И мне важна скорость выполнения программы. И хотел бы проконсультироваться. Делал с помощью...

Debug errors - C++
В чем причина exceptionoв? #include "stdafx.h" #include <stdio.h> #include <iostream> #include <conio.h> int _tmain(int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Убежденный
Системный программист
Эксперт С++
15552 / 7060 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
30.08.2013, 19:51 #2
Это не константы, это препроцессорные определения.
Когда приложение собирается в отладочной конфигурации, среда
задает для него макрос DEBUG. Когда в релизной - макрос NDEBUG.
Это позволяет создавать код, который, например, есть только в
отладочной версии и отсутствует в релизной. Например, assert.
2
slipp1
13 / 12 / 1
Регистрация: 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
Убежденный
Системный программист
Эксперт С++
15552 / 7060 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
30.08.2013, 20:01 #4
NDEBUG не отключает DEBUG.
Эти макросы лучше не изменять и не определять вручную, за
это отвечает среда (Visual Studio, например).
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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
slipp1
13 / 12 / 1
Регистрация: 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
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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
slipp1
13 / 12 / 1
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
30.08.2013, 21:17  [ТС] #8
нужно отдохнуть. спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2013, 21:17
Привет! Вот еще темы с ответами:

Debug error - C++
После запуска при вводе любого числа выдает debug error с предложение прервать, повторить или пропустить. Если нажимаю пропустить выдает...

Debug Dev C++ - C++
Помогите пожалуйста разобраться с Дебаггером, не понимаю как им пользоваться, при нажатии F4, Ctrl+w, F7, F8, ничего не происходит..

debug assertion failed - C++
Помогите пожалуйста,пишет debug assertion failed,когда запускаю .exe, а когда компилирую в программе и запускаю,все отлично идёт,в чем...

Debug assertion failed - C++
Проблема при попытке релиза, дебажится при этом нормально, объясните мне, что может быть не так, где искать баги. (скрин ниже) ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.08.2013, 21:17
Ответ Создать тему
Опции темы

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