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

NDEBUG и DEBUG - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
30.08.2013, 19:45     NDEBUG и DEBUG #1
зачем нужны константы NDEBUG и DEBUG??

спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2013, 19:45     NDEBUG и DEBUG
Посмотрите здесь:

C++ Debug Dev C++
C++ Debug error
C++ Debug errors
debug error C++
C++ Debug error в коде
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14217 / 6232 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
30.08.2013, 19:51     NDEBUG и DEBUG #2
Это не константы, это препроцессорные определения.
Когда приложение собирается в отладочной конфигурации, среда
задает для него макрос DEBUG. Когда в релизной - макрос NDEBUG.
Это позволяет создавать код, который, например, есть только в
отладочной версии и отсутствует в релизной. Например, assert.
slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
30.08.2013, 19:55  [ТС]     NDEBUG и DEBUG #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;
Убежденный
Системный программист
 Аватар для Убежденный
14217 / 6232 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
30.08.2013, 20:01     NDEBUG и DEBUG #4
NDEBUG не отключает DEBUG.
Эти макросы лучше не изменять и не определять вручную, за
это отвечает среда (Visual Studio, например).
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
30.08.2013, 20:41     NDEBUG и DEBUG #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.
slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
30.08.2013, 21:10  [ТС]     NDEBUG и DEBUG #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 что не так?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
30.08.2013, 21:14     NDEBUG и DEBUG #7
slipp1, во-первых, лишняя точка с запятой. Во-вторых, зачем ты используешь # там, где не надо?

C++
1
#define SUM(X, Y) (cout << "the sum of " #X " and " #Y " is " << ((X) + (Y)) << endl)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2013, 21:17     NDEBUG и DEBUG
Еще ссылки по теме:

C++ NDEBUG
C++ Release/Debug
С++ Debug Error!( C++

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

Или воспользуйтесь поиском по форуму:
slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
30.08.2013, 21:17  [ТС]     NDEBUG и DEBUG #8
нужно отдохнуть. спасибо.
Yandex
Объявления
30.08.2013, 21:17     NDEBUG и DEBUG
Ответ Создать тему
Опции темы

Текущее время: 20:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru