Кодовый блок отладки препроцессора

Я пишу программу на C ++ с Codeblocks, и для целей отладки мне нужно знать, установлено ли для Building-Target Codeblocks значение «DEBUG» или «RELEASE».

Я уже попробовал это:

#ifdef DEBUG
printf("Debug-Message");
#endif

и это

#ifdef _DEBUG
printf("Debug-Message");
#endif

Но ни одно из этих слов не определено.
Нужно ли мне определять DEBUG самостоятельно и менять его каждый раз, когда я меняю цель здания, или есть слово, которое я не знаю?

4

Решение

Должен ли я определять DEBUG самостоятельно и менять его каждый раз, когда меняю
Building-Target, или есть слово, которое я не знаю?

Я не знаю, что, если что-нибудь установлено по умолчанию Code :: Blocks. Но, если вы определите свои собственные #defines

Project->Build options...->[Debug|Release]->#defines

вам не нужно менять их при переключении между целями сборки (DEBUG или RELEASE). Он позволяет вам определять значения, специфичные для сборки Debug, а также значения, специфичные для сборки Release.

Чтобы избежать необходимости вводить его вручную каждый раз для каждого нового проекта, вы можете создать небольшой проект, используя только #defines Debug / Release, и сохранить его как шаблон проекта а затем создать новые проекты из этого шаблона проекта.

3

Другие решения

Обычный способ, как предложено утверждают, (3) справочная страница и привычки (с <assert.h> в С или <cassert> в C ++), это определить NDEBUG в командной строке (например, для компиляции с gcc -Wall -DNDEBUG) для неотладочной компиляции. В вашем Makefile вы могли бы CPPFLAGS += -DNDEBUG в режиме релиза (и скомпилировать с g++ -Wall -g в режиме отладки).

Моя собственная привычка может быть что-то вроде

#ifndef NDEBUG
#define dbgprintf(Fmt,...) do{fprintf(stderr,"%s:%d:" Fmt "\n", \
__FILE__, __LINE__, \
##__VA_ARGS__);}while(0)
#else
#define dbgprintf(Fmt,...) do{}while(0)
#endif

в общем заголовочном файле, и использовать dbgprintf("i=%d", i) в другом месте кода.
Обратите внимание, что я использую постоянную цепочку строк Fmt аргумент макроса, что я добавляю к нему постоянную новую строку, и что мои выходные данные отладки содержат имя исходного файла и номер строки (вы также можете использовать __func__ если хочешь). В чистом коде C ++ я мог бы вместо

#ifndef NDEBUG
#define DBGOUT(Out) do{std::out << __FILE__ << ":" << __LINE__ \
<< " " << Out << std::endl;}while(0)
#else
#define DBGOUT(Out) do{}while(0)
#endif

и использовать DBGOUT("i=" << i) с преимуществом использования конкретных определений operator << для моих типов.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector